Utilo

cron表达式示例:30个时间表解释 (有陷)

学习cron语法字段为字段,复制30个测试过的cron表达式每N分钟,平日,月度工作,营业时间等,加上时区陷。

· 7 分钟阅读

自20世纪70年代以来,Cron已经在Unix系统上安排了重复工作,其五个字段的语法现在驱动了Kubernetes CronJobs,GitHub Actions,云调度器如AWS EventBridge和Google云调度器,CI管道和无数的工作库。语法非常紧,但非常细致,。这本指南解释了每一个领域,然后列出了30个实用的表达式,并列出了陷的说明。

五个领域

┌───────────── minute (0–59)
│ ┌─────────── hour (0–23)
│ │ ┌───────── day of month (1–31)
│ │ │ ┌─────── month (1–12 or JAN–DEC)
│ │ │ │ ┌───── day of week (0–6 or SUN–SAT; 7 is also Sunday on most systems)
│ │ │ │ │
* * * * *

每个字段都接受:

  • * 每一个值。
  • 一个数字 5 恰恰意味着5。
  • 一个列表 1,15 表示 1 和 15。
  • 一个范围 9-17 表示包括 9 到 17。
  • 一个步 */15 表示从最小值开始的每15个值;10-50/20 表示10,30,50。

当当前时间匹配所有字段时,就会运行一个任务,除了下面的一个重要例外。将任何表达式粘贴到[cron表达式解析器] (/tools/cron-parser) 中,以查看平面语言描述和下一个运行时间。

每N分钟或每小时

  1. 每分钟都会有* * * * *
  2. */5 * * * * — every 5 minutes (at :00,:05,:10 ...)。
  3. 每隔15分钟就会出现*/15 * * * *。
  4. 0,30 * * * * — every half hour,on the hour and half past。
  5. 7 * * * * — every hour at 7 minutes past。选择一个奇怪的时间分钟,
  6. 0 */2 * * * — every 2 hours,at 00:00,02:00,04:00 ..。
  7. 0 */6 * * * 每天四次:00点,06点,12点,18点
  8. 15 8-18/2 * * * — at 08:15,10:15,12:15,14:15,16:15 and 18:15。

在每一个边界都会重新启动。*/7 in the minute field fires at :00,:07 ..。:56 and then :00 again,so the gap across the hour is 4 minutes,not 7。如果您需要一个真正的固定间隔,不分60时,使用一个支持间隔的调度器,

每日时间表

  1. 0 0 * * * — every day at midnight。
  2. 30 2 * * * — every day at 02:30,a classic backup window。
  3. 0 9,17 * * * — at 09:00 and 17:00 daily。
  4. 0 12 * * * — at noon。
  5. 45 23 * * * — at 23:45,just before midnight for end-of-day reports。

坑:**在当地时间1点到3点之间的工作可以跳过或在夏令时转换时两次运行。如果您的服务器使用的是DST的区域,请在该窗口之外安排关键任务,或者在UTC中运行服务器。

工作日和周末

  1. 0 9 * * 1-5 09:00 周一至周五
  2. */10 9-17 * * 1-5 每10分钟在平日营业时间 (最后一次运行时间为17:50)。
  3. 0 10 * * 6,0 — 10:00 on Saturday and Sunday。
  4. 0 8 * * MON — 08:00 every Monday。名称在大多数实现中都是小写不敏感的。
  5. 30 16 * * 5 星期五16点30分

每月和每年

  1. 0 0 1 * * — midnight on the first day of every month。
  2. 0 6 15 * * — 06:00 on the 15th of each month。
  3. 0 0 1,15 * * — on the 1st and 15th,common for payroll。
  4. 0 0 1 1 * 1月1日午夜。
  5. 0 9 1 */3 * 每个季度的第一天 (一月,四月,七月,十月) 09:00
  6. 0 0 L * * 月的最后一天。注: L 是由Quartz,一些云调度器和一些库支持的扩展程序,但不是经典的Unix cron。
  7. 0 22 28-31 * *结合脚本内部的检查 ([ "$(date -d tomorrow +%d)" = "01" ]) 可移植的方式在月的最后一天运行标准cron。

月日还是周日?

  1. 0 9 13 * 5 很多人读成是"十三日星期五"。在经典的cron中,它意味着每个月的13日和每个星期五。当两个日期字段都被限制时 (*也没有),Vixie cron及其后代在****匹配时运行任务。

为了只在13日星期五运行,请安排0 9 13 * *并检查脚本中的工作日,或者使用具有明确AND语义的调度器。这是cron中最令人惊的规则,值得记住。

特殊的弦

许多cron实现都接受快捷方式:

  1. 我们可以使用 @hourly 和 0 * * * *
  2. @daily or @midnight — 0 0 * * *。
  3. @weekly — 0 0 * * 0.
  4. @reboot — once at startup (Unix cron only;not available in Kubernetes or GitHub Actions)。

平台差异

  • 在 Kubernetes CronJobs 中使用标准五字段语法。自 Kubernetes 1.27 开始,您可以设置 spec.timeZone: "Europe/Berlin";否则,时间表遵循控制器管理员的区域,通常是 UTC。
  • GitHub Actions的时间表始终以 UTC 运行,在高负载期间可以延迟,最小间隔为 5 分钟。如果准确性很重要,请避免0 * * * *;选择奇数分钟。
  • AWS EventBridge使用六个字段 (minute hour day-of-month month day-of-week year) 并要求?在两个日期字段中的一个。
  • ** 石英 (Java) ** 和 ** 春季** 使用六个或七个字段,第一秒:0 0 9 * * MON-FRI。
  • 系统定时器使用不同的,更易读的语法 (OnCalendar=Mon..Fri 09:00) 和处理错过的运行与Persistent=true。

在复制表达式之前,始终确认平台希望使用哪种方言。

时间区

克朗评估了调度器的时区中的表达式。一个由东京开发人员写成的0 9 * * *工作在东京的UTC服务器上运行于09:00 UTC。建议:

  • 在 UTC 中运行服务器和调度器,并在编写调度时将预期的本地时间转换为 UTC。
  • 如果一个工作必须遵循当地的营业时间,在 DST 变化中,使用支持明确时区的调度器。
  • 记录每个运行时间的时间在 UTC 查看Unix时间指南 为什么。

让就业机会更强

正确的定时只是战斗的一半:

  • 防止重叠. 如果一个任务可以运行时间超过其间隔,请使用锁 (在Unix中flock,在Kubernetes中concurrencyPolicy: Forbid)。
  • 使工作变得无效. 一个工作经过两次尝试,例如在重新尝试或日间时间重叠后,不应该对客户加倍收费。
  • 捕获输出. 经典的cron电子邮件输出给本地用户,通常无处可找到。转向日志,并对故障进行警报。
  • 使用绝对路径. Cron运行在最小环境和PATH下;在cron下,你中运行的脚本通常会失败。
  • 静音监视器. 一个心跳服务,当一个工作没有检查时会提醒你,

总结

克朗的五个字段分钟,小时,月份,月份,周日,加上列表,范围和步骤,几乎涵盖每一个重复的时间表。当两个日期字段都设置时,注意OR规则,在边界重置的步骤,在01:0003:00左右的DST,以及具有额外字段的平台方言。验证每个表达式的解析器显示即将运行之前部署它。

本页内容由英文自动翻译而来,如发现错误,欢迎告诉我们。

相关指南