Cron 表达式生成器,免费

以可视化方式构建和理解 cron 任务计划。

快速预设

* * * * *

接下来 5 次运行

Cron 语法参考

* · 任意值

*/5 · 每 5 个单位

1,15 · 在 1 和 15

1-5 · 从 1 到 5 范围

字段:分钟(0–59)、小时(0–23)、日(1–31)、月(1–12)、星期(0–6,0 = 周日)

cron 表达式的简史

五字段 cron 表达式可追溯至 1975 年 5 月,当时一个早期版本作为 Research Unix 第 7 版的一部分从 AT&T Bell 实验室发布。该名称暗示 Chronos,希腊时间的拟人化。格式很简单:在 /usr/lib/crontab 中一行上五个空格分隔字段(分钟、小时、月中日、月、星期)。Paul Vixie 于 1987 年Vixie cron 重写成为事实上的现代实现;每个主要的 Linux 发行版都附带 Vixie 派生的 cron,Vixie 添加了每个用户的 crontab、环境变量支持(MAILTO=CRON_TZ=)和大家今天使用的 @hourly / @daily / @reboot 快捷宏。然后 cron 表达式语法沿着两条路径分叉。Quartz Scheduler(Java,James House,1998;捐赠给 Apache 和 Terracotta)添加了前导秒字段、可选的尾随年字段L(last)/W(weekday)/#(第 n 次出现)运算符,产生了六字段 cron,AWS EventBridge(最初是 CloudWatch Events,2014)和 Spring 的 @Scheduled 注释后来采用了它。Azure Functions(2016)使用的 NCronTab 格式将秒放在首位但保留了五个行为字段。云时代然后将五字段 Vixie 格式标准化为通用语言:Kubernetes CronJobs(2016 年 1.4 版的 alpha,2021 年 1.21 版的 GA)接受恰好五个字段,GitHub Actionson.schedule.cron,2019)、GCP Cloud Scheduler(2018)和 Vercel Cron Jobs(2022)也是如此。可视化 cron 构建器,本工具所属的类别,大约在 2010-2015 年间出现:crontab.guru(Christine Dodrill,2014)成为引用最多的参考,而 cron-descriptor 库(Brady Holt,最初是 .NET,移植到 Java/Python/JS)驱动了大多数解码器和生成器所依赖的「cron 用简单英语」翻译层。Bell 实验室半个世纪之后,同样的五个字段仍在调度世界的夜间备份。

cron 表达式的结构

表达式在哪里使用

标准、方言和里程碑

更多常见问题

五个字段与六个或七个字段相同吗?

不。经典的 POSIX 形式是五个字段(分钟、小时、月中日、月、星期)。Quartz 和 Spring 通过添加前导秒列使用六个字段,Quartz 接受可选的第七年字段。AWS EventBridge 总是使用以年结尾的六个字段(cron(min hr dom mon dow yr))。将五字段表达式粘贴到 Quartz 或 Spring 会引发语法错误;将六字段表达式粘贴到 Linux 会静默地误解字段。

cron 可以表达的最小间隔是多少?

标准 Unix cron 上每分钟(* * * * *)。没有内置秒字段。如果你需要亚分钟节奏,Quartz 或 NCronTab 之类的调度器会添加一个,systemd 定时器可以使用 OnUnitActiveSec=30s。GitHub Actions 将最短节奏限制为 5 分钟,EventBridge 在计划时间的 60 秒窗口内触发,所以不要依赖 cron 来获得硬实时精度。

如何在每月的最后一天运行作业?

标准五字段 cron 没有原生的「月份最后一天」运算符。Quartz 和 AWS EventBridge 在月中日字段支持 L0 0 L * ? 在最后一天的午夜触发。在普通 Linux cron 上,通常的解决方法是在候选日上每天调度并门控命令:0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /path/to/script。systemd 定时器直接用 OnCalendar=*-*-* 00:00:00 表达它。

为什么我的 cron 作业没有在我预期的时候运行?

通常的嫌疑人,按顺序:(1) 服务器与你假设的时区不同(用 date 检查);(2) PATH 不是你的交互式 shell 所拥有的,所以一个命令在提示符下工作但在 cron 下失败(使用绝对路径);(3) 输出发送到电子邮件而你错过了(设置 MAILTO="" 或重定向到日志文件);(4) cron 守护进程未运行(systemctl status cron);(5) OR 陷阱(见上文)在你未打算的额外日子上触发。

cron、anacron 和 systemd 定时器之间有什么区别?

Cron 期望系统在计划时间运行并静默跳过停机期间的作业:对始终开启的服务器很好,对笔记本电脑不好。Anacron 按作业跟踪上次运行的时间戳,并在重启后追赶错过的作业,代价是日级而非分钟级精度。systemd 定时器在大多数现代 Linux 发行版上取代 cron:它们支持日历和单调调度,记录到 journald,可以声明服务依赖项,并使用 Persistent=true 结合 cron 式精度与 anacron 式追赶。

时区和夏令时如何影响 cron?

大多数 cron 守护进程在系统时区中解释调度。在云服务器上,这通常意味着 UTC,所以 0 9 * * * 在 9 AM UTC 触发,而不是本地 9 AM。在 Linux crontab 中设置 CRON_TZ=America/New_York;Kubernetes 使用 spec.timeZone;AWS、GCP 和 Vercel 各自采用显式 IANA 区域。在春季向前调整时,计划在跳过小时的作业由 Vixie cron 立即运行,但由 AWS EventBridge 完全跳过。最安全的模式是将 cron 留在 UTC 中,并在作业内转换。

相关工具