ToolConvoyToolConvoyv2.6

什么是 Cron 表达式?

Cron 表达式是一个五字段时间串,告诉类 Unix 调度器何时运行任务。我们逐一拆解每个字段、星期几的常见陷阱,以及如何读懂别人写的 crontab。

广告

什么是 Cron 表达式?

Cron 表达式是一个紧凑的五字段时间串,告诉类 Unix 调度器(cron、cronie、systemd timer 的 cron 语法模式、Spring Scheduler、Quartz 标准模式、GitHub Actions schedule、Kubernetes CronJob)何时运行任务。它长这样:

*/15 9-17 * * 1-5

五个字段,空白分隔。每个字段对时间的某个单位加一条约束,五个约束在同一时刻全部满足时,表达式就匹配一次触发。

五个字段

从左到右:

# 字段 允许值 特殊字符
1 分钟 0-59 * , - /
2 小时 0-23 * , - /
3 日 1-31 * , - / ? L W
4 月 1-12(或 JAN-DEC) * , - /
5 星期几 0-7(0 和 7 都代表周日,或 SUN-SAT) * , - / ? L #

* 表示"所有值"——每一分钟、每一小时、每一天。

*/15 9-17 * * 1-5 到底意味着什么

逐项读:

  • */15 — 在第 0、15、30、45 分钟触发(从 0 起每 15 分钟)。
  • 9-17 — 9 点到 17 点(含)。
  • * * — 任意日、任意月。
  • 1-5 — 周一到周五。

合起来:周一到周五的 09:00、09:15、09:30、09:45、10:00 …… 17:45。

三个最常见的特殊字符

  • , — 列表。1,15,45 是第 1、15、45 分钟。
  • - — 范围。9-17 是 9 点到 17 点(含)。
  • / — 步长。*/15 是"每 15",可与范围配对,如 1-30/5 是"1 到 30 之间每 5"。

星期字段那个坑

POSIX cron 中,0 和 7 都代表周日。大多数现代实现也接受英文星期名(SUN、MON 等),但具体扩展语法因实现而异。Quartz 和 Spring 额外支持 L(last)、W(weekday)、#(nth),标准 cron 没有。若你的计划要跨系统跑得通,请只使用五字段 POSIX 方言。

日 AND 星期

当日字段和星期字段都是非 * 时,cron 视为 OR,不是 AND。所以 0 0 1 * 1 是"每月 1 日 OR 任意周一"的凌晨零点,不是"每月第一个周一"。要表达"每月第一个周一"需要 Quartz 的 # 扩展(0 0 * * 1#1)。

工具

想要一个浏览器内的 cron 编辑器:列出最近 5 次触发时间、校验每个字段,看本站的 Cron Generator。完全在客户端跑,无需注册。

想了解整个站上"时间、调度、日期计算"主题,看 Time and Cron hub。

另见

Related tools

Related hubs

广告