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分钟或每小时
- 每分钟都会有
* * * * * */5 * * * *— every 5 minutes (at :00,:05,:10 ...)。- 每隔15分钟就会出现
*/15 * * * *。 0,30 * * * *— every half hour,on the hour and half past。7 * * * *— every hour at 7 minutes past。选择一个奇怪的时间分钟,0 */2 * * *— every 2 hours,at 00:00,02:00,04:00 ..。0 */6 * * *每天四次:00点,06点,12点,18点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时,使用一个支持间隔的调度器,
每日时间表
0 0 * * *— every day at midnight。30 2 * * *— every day at 02:30,a classic backup window。0 9,17 * * *— at 09:00 and 17:00 daily。0 12 * * *— at noon。45 23 * * *— at 23:45,just before midnight for end-of-day reports。
坑:**在当地时间1点到3点之间的工作可以跳过或在夏令时转换时两次运行。如果您的服务器使用的是DST的区域,请在该窗口之外安排关键任务,或者在UTC中运行服务器。
工作日和周末
0 9 * * 1-509:00 周一至周五*/10 9-17 * * 1-5每10分钟在平日营业时间 (最后一次运行时间为17:50)。0 10 * * 6,0— 10:00 on Saturday and Sunday。0 8 * * MON— 08:00 every Monday。名称在大多数实现中都是小写不敏感的。30 16 * * 5星期五16点30分
每月和每年
0 0 1 * *— midnight on the first day of every month。0 6 15 * *— 06:00 on the 15th of each month。0 0 1,15 * *— on the 1st and 15th,common for payroll。0 0 1 1 *1月1日午夜。0 9 1 */3 *每个季度的第一天 (一月,四月,七月,十月) 09:000 0 L * *月的最后一天。注:L是由Quartz,一些云调度器和一些库支持的扩展程序,但不是经典的Unix cron。0 22 28-31 * *结合脚本内部的检查 ([ "$(date -d tomorrow +%d)" = "01" ]) 可移植的方式在月的最后一天运行标准cron。
月日还是周日?
0 9 13 * 5很多人读成是"十三日星期五"。在经典的cron中,它意味着每个月的13日和每个星期五。当两个日期字段都被限制时 (*也没有),Vixie cron及其后代在****匹配时运行任务。
为了只在13日星期五运行,请安排0 9 13 * *并检查脚本中的工作日,或者使用具有明确AND语义的调度器。这是cron中最令人惊的规则,值得记住。
特殊的弦
许多cron实现都接受快捷方式:
- 我们可以使用
@hourly和0 * * * * @dailyor@midnight—0 0 * * *。@weekly—0 0 * * 0.@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,以及具有额外字段的平台方言。验证每个表达式的解析器显示即将运行之前部署它。
本页内容由英文自动翻译而来,如发现错误,欢迎告诉我们。