cron表达式是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cron表达式是啥?相关的知识,希望对你有一定的参考价值。

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:

(1) Seconds Minutes Hours DayofMonth Month DayofWeek Year。

(2)Seconds Minutes Hours DayofMonth Month DayofWeek。



每一个域含义是:

(1)*:表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件。

(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。

例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。

参考技术A

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,Cron有如下两种语法格式:

(1) Seconds Minutes Hours DayofMonth Month DayofWeek Year

(2)Seconds Minutes Hours DayofMonth Month DayofWeek

corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

常用表达式例子:

(1)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发

(2)0 15 10 * * ? 2005    2005年的每天上午10:15触发


cron表达式中的特殊字符

每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:

1、*:表示匹配该域的任意值,假如在Minutes域使用*,即表示每分钟都会触发事件。

2、-:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次。

3、/:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次。

4、,:表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。

5、L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。

6、LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。

7、#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

每 30 秒运行一次 cron 作业的最佳方式是啥? [复制]

【中文标题】每 30 秒运行一次 cron 作业的最佳方式是啥? [复制]【英文标题】:Which is the best way to run a cron job every 30 seconds? [duplicate]每 30 秒运行一次 cron 作业的最佳方式是什么? [复制] 【发布时间】:2012-11-14 06:43:26 【问题描述】:

我想每 30 秒运行一次 cron 作业,但 cron 不允许调度作业的频率高于每分钟一次。

每 30 秒运行一次 cron 作业的最佳方式是什么?

【问题讨论】:

【参考方案1】:

这是一种避免滑动窗口问题的方法。创建两个脚本,您的主要脚本(此处为 main.sh)和睡眠脚本(sleep30.sh):

main.sh:

#!/bin/bash
date >>/tmp/main.out

sleep30.sh:

#!/bin/bash
sleep 30
. $1

crontab:

* * * * * /pathtoscripts/sleep30.sh /pathtoscripts/main.sh
* * * * * /pathtoscripts/main.sh

不优雅,但应该可以。

【讨论】:

【参考方案2】:

您可以使用 cron 的最短时间间隔是 1 分钟。 您可以在 bash 脚本中设置 sleep,但这可能是您能做的最好的事情

【讨论】:

【参考方案3】:

如果任务执行时间短,可以忽略,可以这样:

* * * * * /path/cmd; sleep 30; /path/cmd

【讨论】:

【参考方案4】:

简短的回答是您不能在一分钟内安排 cron 作业。您可以使用sleep 30,但这会引入滑动窗口问题(任务现在间隔为 30 秒 + 任务的运行时间)。您可以将任务放在 while true 循环中,并让它检查每次迭代是否至少经过 30 秒,如果是,则再次运行任务,如果不是 sleep 1

【讨论】:

【参考方案5】:

您可以升级到最新的 FreeBSD 测试版,它有一个特殊的新 cron 修饰符:@every_second。 将您的 cronjob 包裹在 lockf 中,休眠 30 秒,运行该作业,然后终止。这样一分钟可以运行两次。

【讨论】:

以上是关于cron表达式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Quartz cron 触发器在每天 00 时运行的表达式是啥?

cron表达式0 * * * * ?啥意思

cron表达式的使用

xxl-job中的cron表达式详解

cron表达式详解

Cron表达式