Featured image of post Cron 表达式

Cron 表达式

介绍了 Cron 表达式的基本格式和含义,用于配置定时任务的执行时间。详细解释了每个字段的作用,并以 0 */5 * * * * 为例,说明该表达式表示每隔 5 分钟执行一次任务

平时工作中,可能会时不时碰到像 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

使用

下面举一些例子,尽量全地覆盖可能用到的场景:

  1. 每 5 秒执行一次
    • 表达式:*/10 * * * * *
    • 解释:在秒的位置上 */10 表示每隔 10 秒。上面介绍过这类基础的用法。
  2. 每小时的第 10 分钟执行
    • 表达式:0 10 * * * *
    • 解释:分的位置是 10,秒是 0,表示每小时的第 10 分钟开始时执行。
  3. 每天凌晨 2 点执行
    • 表达式:0 0 2 * * *
    • 解释:时为 2,分和秒为 0,表示每天凌晨 2 点整执行。
  4. 每隔 2 小时执行一次
    • 表达式:0 0 */2 * * *
    • 解释:时的位置 */2 表示每隔 2 小时执行。
  5. 每月 1 号凌晨 0 点执行
    • 表达式:0 0 0 1 * *
    • 解释:日为 1,时、分、秒为 0,表示每月 1 号凌晨 0 点执行。
  6. 每周一早上 9 点执行
    • 表达式:0 0 9 * * 1
    • 解释:时为 9,分和秒为 0,周为 1(周一),即每周一早上 9 点执行。
  7. 每月最后一天晚上 11 点 59 分 59 秒执行
    • 表达式:59 59 23 L * *
    • 解释:秒为 59,分是 59,时是 23,日的位置 L 表示每月最后一天。
  8. 每年 1 月 1 日凌晨 0 点执行
    • 表达式:0 0 0 1 1 *
    • 解释:日为 1,月为 1,时、分、秒为 0,表示每年 1 月 1 日凌晨 0 点执行。
  9. 工作日(周一到周五)早上 8 点执行
    • 表达式:0 0 8 * * 1-5
    • 解释:时为 8,分和秒为 0,周为 1-5,表示周一到周五早上 8 点执行。
Last updated on Wed, Dec 18, 2024 00:55 +0800
Built with Hugo
Theme Stack designed by Jimmy