Cron表达式基本结构

f1 f2 f3 f4 f5 program
*  *  *  *  *  <command-to-execute>
│  │  │  │  │
│  │  │  │  └─ 星期几 (0 - 7)  (0 或 7 表示星期日)
│  │  │  └──── 月份 (1 - 12)
│  │  └────── 日 (1 - 31)
│  └──────── 时 (0 - 23)
└────────── 分 (0 - 59)
  1. * 表示任何值,f1* 时,表示每分钟都执行,f2* 时,表示每小时都要执行,f5* 表示每星期都要执行。

  2. - 表示时间范围, f1a-b,表示在每分钟的第 a 到第 b 分钟这段时间内,每一分钟都会执行任务, f2a-b,表示在每小时的第 a 到第 b 小时这段时间内,每一小时都会执行任务。

  3. / 表示间隔,例如 */n,以 f1 为例,表示每n 分钟要执行一次,适用于分钟,小时,每日,每月,而对于星期来说,0/n 表示每隔第n 个星期天(星期天,0)执行一次,1/3 表示从星期一(星期天为0,星期一为1)开始,每隔 3 天执行一次任务

  4. f1 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行。

  5. ? 表示不指定值,仅在日和星期字段中使用。

  6. L :表示最后一个。

  7. W :表示最近工作日。

  8. # :表示该月的第n个星期。

?用法

Cron 表达式中,? 主要用于 星期 字段,表示“不指定具体的值”,它的作用通常是避免日和星期字段之间的冲突。

示例 1:在 字段使用 ?

假设你想在每个星期五执行任务,并且不关心日期,可以在 字段中使用 ?

表达式:0 0 1-7 * 5

  • 0 0 表示在午夜 12 点执行。

  • 1-7 表示每月的 1 号到 7 号。

  • * 表示每月都执行。

  • 5 表示每周的星期五。

由于你已经指定了星期五(5),但如果你还在 字段指定了一个值(例如 1-7),这可能会导致冲突,因为每个月的 1 号到 7 号可能有多次星期五。为了避免这种情况, 字段可以使用 ?,表示不关心日期,而只关心星期。

正确的表达式:0 0 ? * 5

  • 0 0:午夜 12 点执行。

  • ?:不指定具体日期。

  • *:每个月都执行。

  • 5:每周的星期五。

这表示每月的每个星期五午夜 12 点执行任务,不考虑日字段。

示例 2:在 星期 字段使用 ?

如果你想指定任务在某个月的某一天执行,而不关心星期几是什么,你可以在 星期 字段使用 ?

表达式:0 0 15 * ?

  • 0 0 表示在午夜 12 点执行。

  • 15 表示每个月的 15 号。

  • * 表示每月都执行。

  • ? 表示星期不关心,避免和日字段冲突。

这表示每月的 15 号午夜执行任务,无论那一天是星期几。

示例 3:结合 星期 字段

有时,你可能想在某个月的特定日期和星期几执行任务,但又不希望两个字段产生冲突。这时可以结合 ? 来处理。

假设你想在每个月的 1 号和每个星期三执行任务。

表达式:0 0 1 * 3

  • 0 0 表示在午夜 12 点执行。

  • 1 表示每个月的 1 号。

  • * 表示每月都执行。

  • 3 表示每周的星期三。

这里的 13 是可以共存的,不会冲突,因为 Cron 会按顺序检查。如果你不想在某个月的 1 号和星期三两者同时出现时执行,可以通过在 星期 字段使用 ? 来避免这种冲突。

例如,0 0 1 * ? 表示在每月的 1 号执行,而不关心星期几。

总结:

  • 当你在 字段指定具体日期时,可以在 星期 字段使用 ?,表示不关心星期几。

  • 当你在 星期 字段指定具体星期几时,可以在 字段使用 ?,表示不关心日期。

L用法

在 Cron 表达式中,L 是一个特殊字符,它表示“最后”的意思,通常用于“日”和“星期”字段。

1. L 在日字段中的使用

字段中,L 表示该月的“最后一天”,即每个月的最后一天。

示例:

  • 0 0 L * *:这个表达式表示在每个月的最后一天的午夜 12 点执行任务。

    • 0 0:午夜 12 点。

    • L:每个月的最后一天。

2. L 在星期字段中的使用

星期 字段中,L 表示该月的“最后一个星期几”。这意味着如果你指定某个星期几,并使用 L,Cron 将在该月的最后一次出现该星期几时执行任务。

示例:

  • 0 0 * * 5L:这个表达式表示在每个月的最后一个星期五的午夜 12 点执行任务。

    • 0 0:午夜 12 点。

    • * *:每个月的每一天。

    • 5L:每个月的最后一个星期五。

3. L 和数字结合使用

L 也可以与数字结合使用,表示从某个特定的天或星期几开始的最后一天。

示例 1:L 与数字结合使用,表示“倒数第 N 天”

字段,L 后面可以跟一个数字,表示从该月的最后一天开始倒数的第 N 天。

  • 0 0 15L * *:表示每个月的倒数第 15 天执行任务。

示例 2:L 与数字结合使用,表示“倒数第 N 个星期几”

星期 字段,L 后面可以跟一个数字,表示每个月的倒数第 N 个星期几。

  • 0 0 * * 5L:表示每个月的最后一个星期五执行任务。

W的用法

在 Cron 表达式中,W 是一个特殊字符,用于指定一个“工作日”。它通常用于 字段,用来表示离指定日期最近的工作日(星期一至星期五)。

示例 1:每个月的第 15 号的最近工作日执行任务

Cron 表达式:

0 12 15W * *

解释:

  • 0:表示任务在 0 分钟执行。

  • 12:表示任务在 12 点执行。

  • 15W:表示每个月的 15 号的最近工作日执行任务。如果 15 号是周六或周日,则会选择下一个星期一(工作日)执行;如果 15 号本身是工作日(星期一到星期五),任务就在该天执行。

  • *:表示每个月。

  • *:表示每周的任何一天。

示例 2:每个月的第 1 号的最近工作日执行任务

Cron 表达式:

0 9 1W * *

解释:

  • 0:表示任务在 0 分钟执行。

  • 9:表示任务在 9 点执行。

  • 1W:表示每个月的 1 号的最近工作日执行任务。如果 1 号是周六或周日,任务会在下一个周一(工作日)执行。如果 1 号本身是工作日,则任务在 1 号当天执行。

  • *:表示每个月。

  • *:表示每周的任何一天。

示例 3:每个月的第 10 号的最近工作日执行任务

Cron 表达式:

0 18 10W * *

解释:

  • 0:表示任务在 0 分钟执行。

  • 18:表示任务在 18 点执行。

  • 10W:表示每个月的 10 号的最近工作日执行任务。如果 10 号是周六或周日,任务会在下一个周一(工作日)执行。如果 10 号本身是工作日,则任务在 10 号当天执行。

  • *:表示每个月。

  • *:表示每周的任何一天。

示例 4:每个星期三的最近工作日执行任务(假设某个月的 3 号是周六)

Cron 表达式:

0 8 3W * 3

解释:

  • 0:表示任务在 0 分钟执行。

  • 8:表示任务在 8 点执行。

  • 3W:表示每个月的 3 号的最近工作日执行任务。假设 3 号是周六,任务将会在下一个星期一(工作日)执行。

  • *:表示每个月。

  • 3:表示任务在星期三执行。

示例 5:每个月的最后一个工作日执行任务

Cron 表达式:

0 17 LW * *

解释:

  • 0:表示任务在 0 分钟执行。

  • 17:表示任务在 17 点执行。

  • LW:表示每个月的最后一个工作日执行任务。如果这个月的最后一天是周六或周日,任务会在前一个星期五执行。

  • *:表示每个月。

  • *:表示每周的任何一天。

#的用法

# 用于星期字段(即 Cron 表达式中的第 5 个字段),其语法为 n#x,表示该月的第 xn 星期。

  • n 表示星期几(0 - 6),其中 0 代表星期天,1 代表星期一,依此类推。

  • x 表示该月中的第 xn 星期(例如,第 1 次、第 2 次、第 3 次等)。

示例 1:每个月的第二个星期三执行任务

Cron 表达式:

0 12 * * 3#2

解释:

  • 0:任务在 0 分钟执行。

  • 12:任务在 12 点执行。

  • *:任务可以在任何日期执行。

  • *:任务可以在任何月份执行。

  • 3#2:表示每个月的第二个星期三执行任务。3 表示星期三,#2 表示第二次出现的星期三。

示例 2:每个月的第一个星期五执行任务

Cron 表达式:

0 9 * * 5#1

解释:

  • 0:任务在 0 分钟执行。

  • 9:任务在 9 点执行。

  • *:任务可以在任何日期执行。

  • *:任务可以在任何月份执行。

  • 5#1:表示每个月的第一个星期五执行任务。5 表示星期五,#1 表示第一个星期五。

示例 3:每个月的第三个星期二执行任务

Cron 表达式:

0 15 * * 2#3

解释:

  • 0:任务在 0 分钟执行。

  • 15:任务在 15 点执行。

  • *:任务可以在任何日期执行。

  • *:任务可以在任何月份执行。

  • 2#3:表示每个月的第三个星期二执行任务。2 表示星期二,#3 表示第三次出现的星期二。

示例 4:每个月的最后一个星期日执行任务

Cron 表达式:

0 18 * * 0#L

解释:

  • 0:任务在 0 分钟执行。

  • 18:任务在 18 点执行。

  • *:任务可以在任何日期执行。

  • *:任务可以在任何月份执行。

  • 0#L:表示每个月的最后一个星期天执行任务。0 表示星期天,#L 表示该月的最后一次星期天。

参考连接

https://www.runoob.com/linux/linux-comm-crontab.html

https://chatgpt.com/