开发 · 阅读约 4 分钟 ·
cron 表达式详解,附 10 个现成示例
五个字段、四个符号,外加一个时区陷阱。通过可直接复制的示例,学会读写 cron 定时任务。

cron 是全球服务器上运行备份、报表和清理任务的调度程序,它的语法也出现在 GitHub Actions、Kubernetes 的 CronJob 和大多数云调度服务中。一条调度规则由五个用空格分隔的字段组成。
┌ 分钟 (0-59)
│ ┌ 小时 (0-23)
│ │ ┌ 日 (1-31)
│ │ │ ┌ 月 (1-12)
│ │ │ │ ┌ 星期 (0-6, 0 = 星期日)
* * * * *
四个符号
* 表示任意值。逗号表示列表(1,15),连字符表示范围(1-5),斜杠表示步长(*/15 = 每 15 个单位)。这四个符号几乎能覆盖所有调度需求。
10 个示例
*/5 * * * * 每 5 分钟
0 * * * * 每个整点
0 9 * * * 每天 09:00
30 2 * * * 每晚 02:30
0 9 * * 1-5 工作日 09:00
0 18 * * 5 每周五 18:00
0 0 1 * * 每月 1 日零点
0 0 1 1 * 每年一次,1 月 1 日
0 */6 * * * 每 6 小时
15 8,12,17 * * * 每天 08:15、12:15 和 17:15
陷阱一:日与星期
当两个字段都有限定时,传统 cron 只要其中一个匹配就会运行。0 0 1 * 1 会在每月 1 日运行,也会在每个星期一运行,而不只是在恰逢 1 日的星期一。
陷阱二:时区
cron 本身没有时区。任务按运行它的机器或服务所在的时区执行,而这通常是 UTC。在 UTC 服务器上设为 0 9 * * * 的任务会在 UTC 09:00 运行,在你所在的地区可能早或晚几个小时,夏令时还可能再让它偏移。
陷阱三:重叠执行与错过执行
无论上一次执行是否结束,cron 都会按时启动任务。每 5 分钟运行一次、却要跑 7 分钟的备份,最终会有两份同时在跑。给耗时长的任务加上锁(在 Linux 上用 flock 一行就能搞定),或者让它们可以安全地并行运行。cron 也不会补跑:如果 02:30 机器关着,那晚 02:30 的任务就直接不运行。
*/5 * * * * flock -n /tmp/backup.lock /usr/local/bin/backup.sh
简写与细微差别
很多 cron 实现接受 @hourly、@daily、@weekly、@monthly 和 @reboot 这样的简写来代替五个字段。大多数实现中星期日可以写成 0 或 7,也允许 MON、JAN 这样的名称。各平台在细节上有差异,所以请查看实际运行任务的系统的文档,托管的云端调度器尤其如此。
输出去哪了?
cron 默认会把任务的输出用邮件发给本地用户,在大多数服务器上这意味着输出就丢了。把输出重定向到日志文件或你的日志系统,这样任务失败时会留下痕迹:
30 2 * * * /usr/local/bin/report.sh >> /var/log/report.log 2>&1
部署前先检查
把表达式粘贴到 4Dev 的 cron 表达式解析器里,它会用通俗的语言把调度规则读给你听。它支持标准的五字段格式;带秒或年份的六字段、七字段表达式(如 Quartz 或 Spring 所用)会被拒绝并提示错误。