平时工作中,可能会时不时碰到像 0 */5 * * * *
这种 Cronjob 定时任务的配置,特别是运维和服务端的同学,经常会打交道。本文只是最基础的用法,后面有新内容再补充,仅作为自己学习、记录、备忘的文档沉淀下。
基础语法
Cron 表达式的基本格式和含义
- Cron 表达式用于配置定时任务的执行时间。它由 6 ~ 7 个段组成,从左到右依次是:秒(0 - 59)、分(0 - 59)、时(0 - 23)、日(1 - 31)、月(1 - 12)、周(0 - 6,0 表示周日)。
- 上面提到的表达式
0 */5 * * * *
中,有 6 个字段,一一对号入座就行。 - 除了直接写
*
、*/数字
、数字
,这种写法之外,还有用逗号隔开的写法,如第 4 个位置表示一个月中的哪一日,如果它写成1,3,5
表示每个月的 1 日、3 日和 5 日。
对每个字段的具体分析 **
- 秒(0):表示任务在每分钟的第 0 秒开始执行。
- 分(*/5):
*/5
是一个特殊的语法。在这里,*
表示 “所有可能的值”,/
是一个间隔符号。所以*/5
表示 “每隔 5 分钟”。也就是说,任务会在 0 分、5 分、10 分、15 分…… 以此类推,每隔 5 分钟执行一次。 - 时(*):
*
表示每一个小时,即任务会在一天中的每一个小时都有可能执行,具体的分钟由前面的*/5
决定。 - 日(*):
*
表示一个月中的每一天,即任务在一个月中的每一天都有可能执行。这是第 4 个位置,它有一些特定的语法,如:L
:表示每月的最后一天。W
:用于指定最接近给定日期的工作日(周一到周五),如“15W”,它表示最接近 15 日的工作日。LW
:合起来,用于指定本月的最后一个工作日。
- 月(*):
*
表示每一个月,即任务在每一个月都有可能执行,具体日期由前面的日、时、分决定。 - 周(*):
*
表示每一个周,即任务在每一周都有可能执行,这个比较特殊,也可以省略而只需要前面 5 个也行。
开头说的这个配置,含义是在每分钟的第 0 秒开始,并且每隔 5 分钟执行一次,每天每小时、每月都会按照这个间隔执行。简单说,就是 5 分钟执行一次。
简单好记
一个比较简单的方法来记,就是把 *
翻译成“每”,把 /
翻译成“每隔”,非 *
的则对应地加上时间表达即可。
另一个方法是,从后往前倒着看,比如只看前三个,它就是时间的表达,像 1:00:00
使用
下面举一些例子,尽量全地覆盖可能用到的场景:
- 每 5 秒执行一次
- 表达式:
*/10 * * * * *
- 解释:在秒的位置上
*/10
表示每隔 10 秒。上面介绍过这类基础的用法。
- 表达式:
- 每小时的第 10 分钟执行
- 表达式:
0 10 * * * *
- 解释:分的位置是 10,秒是 0,表示每小时的第 10 分钟开始时执行。
- 表达式:
- 每天凌晨 2 点执行
- 表达式:
0 0 2 * * *
- 解释:时为 2,分和秒为 0,表示每天凌晨 2 点整执行。
- 表达式:
- 每隔 2 小时执行一次
- 表达式:
0 0 */2 * * *
- 解释:时的位置
*/2
表示每隔 2 小时执行。
- 表达式:
- 每月 1 号凌晨 0 点执行
- 表达式:
0 0 0 1 * *
- 解释:日为 1,时、分、秒为 0,表示每月 1 号凌晨 0 点执行。
- 表达式:
- 每周一早上 9 点执行
- 表达式:
0 0 9 * * 1
- 解释:时为 9,分和秒为 0,周为 1(周一),即每周一早上 9 点执行。
- 表达式:
- 每月最后一天晚上 11 点 59 分 59 秒执行
- 表达式:
59 59 23 L * *
- 解释:秒为 59,分是 59,时是 23,日的位置
L
表示每月最后一天。
- 表达式:
- 每年 1 月 1 日凌晨 0 点执行
- 表达式:
0 0 0 1 1 *
- 解释:日为 1,月为 1,时、分、秒为 0,表示每年 1 月 1 日凌晨 0 点执行。
- 表达式:
- 工作日(周一到周五)早上 8 点执行
- 表达式:
0 0 8 * * 1-5
- 解释:时为 8,分和秒为 0,周为 1-5,表示周一到周五早上 8 点执行。
- 表达式: