Cron 表达式,是应用在 Unix 和类 Unix 操作系统之中,让脚本、任务定时进行周期性重复的执行。Cron 表达式有着丰富的表达能力,能够适应各种时间表达需求。本页整理了一些基本语法和常用样例,供大家参考。
首先在了解 cron 表达式之前,先谈谈 crontab 定时任务;日常在开发或运维中,经常遇到一些周期性执行的任务或需求,比如说,每隔一段时间执行一个脚本,每周一执行一个命令或操作。而 linux 已经给我们提供了一个便捷的方式 -- crontab 定时任务;crontab 就是一个自定义定时器,我们可以利用 crontab 命令在固定的间隔时间执行指定的系统指令或 shell script 脚本。而这个时间间隔的写法与我们平常用到的 cron 表达式相似。作用都是通过利用字符或命令去设置定时周期性地执行一些操作。
我们可以将 cron 表达式看作一个以 5 或 6 个字符串空格隔开的字符串。这个 5 或 6 个空格将字符串划分为 6 或 7 个域,每个域代表着不同的含义。默认从左到右为:" 秒 分 小时 日 月 星期几 年份
"。
域 | 字段 | 含义 | 范围或通配符 | 必填 |
---|---|---|---|---|
秒 | Seconds | 秒 | 0-59 或 ,-*/ | 是 |
分 | Minutes | 分钟 | 0-59 或 ,-*/ | 是 |
时 | Hours | 小时 | 0-23 或 ,-*/ | 是 |
日 | Day-of-Month | 日期 | 1-31 或 ,-*?/LW | 是 |
月 | Month | 月份 | 1-12 (或 JAN-DEC )或者 ,- * / | 是 |
星期 | Day-of-Week | 每星期的周几 | 1-7 (或 SUN ,MON ,TUE ,WED ,THU ,FRI ,SAT )或者 , - * ? / L # | 是 |
年 | Year | 年份 | 1970-2099 或 - * / | 否 |
例子
0 0 12 * * ?
0 15 10 ? * *
0 15 10 * * ?
0 15 10 * * ? *
0 15 10 * * ? 2005
0 * 14 * * ?
0 0/5 14 * * ?
0 0/5 14,18 * * ?
0 0-5 14 * * ?
0 10,44 14 ? 3 WED
0 15 10 ? * MON-FRI
0 15 10 15 * ?
0 15 10 L * ?
0 15 10 ? * 6L
0 15 10 ? * 6L 2002-2005
0 15 10 ? * 6#3
详解
,
:表示列出枚举值。如在月中的值为 1,3
, 则表示一月份和 3 月份都触发事件。
*
:表示匹配该域任意值,如小时的字段为 *
时,表示每一小时都触发事件
?
:表示不指定值,用于日期和星期字段之间进行互斥
。通常在日期和星期字段中的一个指定值,另外一个用 ?
表示不指定值。个人理解就是忽略该字段的值,直接根据另外一个字段的值进行执行。比如说:日期为 2
,则星期应为 ?
;
-
:表示范围,一个连续触发的区间。如:时的值为 9-12
,则表示 9-12 小时中的每个小时都触发事件。
/
:表示间隔时间触发事件(开始时间 / 时间间隔)。如:在分钟值为 0/15
,则表示从 0 分开始,每隔 15 分钟触发一遍事件。
#
:表示该月第 n 个星期 x (x#n),仅用星期域。如:星期:6#3
,表示该月的第三个星期五。
L
:表示最后(最后一天或最后一个星期几);仅出现在日和星期的域中。用在日则表示该月的最后一天,用在星期则表示该月的最后一个星期 X。如:星期域上的值为 5L,则表示该月最后一个星期的星期四。在使用'L'
时,不要指定列表','
或范围'-'
,否则易导致出现意料之外的结果。
W
:仅用在日的域中,表示距离当月给定日期最近的工作日(周一到周五)。
如:"4W"
表示距离 4 号最近的工作日(当月的)触发事件;(1)当 4 号就是工作日时,则表示当天触发;当 4 号为周六时,则表示 3 号(周五)触发;(2)当 4 号为周日时,则表示在 5 号(周一)触发;再如:"1W"
表示距离 1 号最近的工作日触发事件,但是,该工作日只算当月的。假如当月 1 号是周六,则 "1W
" 表示在当月 3 号(周一)触发事件。就算上个月的最后一天是工作日,也不会触发事件。
LW
:‘L’
和'W'
可以一起组合在日字段使用。表示当月的最后一个工作日触发事件。
本文作者:Gustav
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!