Cron 是 Unix / Linux 系统中用来描述「定时任务」的字符串,由 5 个(或 6 个)用空格分隔的字段组成,每个字段代表一个时间维度。系统守护进程 crond 每分钟检查一次,凡是匹配当前时间的表达式就执行对应的命令。
本工具提供可视化生成*与*表达式解析两种用法:改左侧配置即可实时生成表达式,也可以直接在右侧编辑表达式,立刻看到中文含义与未来 10 次执行时间。
标准 5 段格式(Linux crontab、大部分 Linux 发行版):
| 位置 | 字段 | 取值范围 | 允许的特殊字符 |
|---|---|---|---|
| 1 | 分钟 | 0–59 | * , - / |
| 2 | 小时 | 0–23 | * , - / |
| 3 | 日期 | 1–31 | * , - / |
| 4 | 月份 | 1–12 | * , - / |
| 5 | 星期 | 0–6(0 和 7 都表示周日) | * , - / |
6 段格式(在分钟前多一个「秒」字段)常见于 Quartz、Spring @Scheduled、部分 Java 任务框架。注意各家实现有差异:Quartz 还额外支持第 7 段「年」以及 ?、L、W、# 等扩展字符,本工具只覆盖通用的 * , - / 语法。
| 字符 | 含义 | 示例 | 说明 |
|---|---|---|---|
* | 每一个 | * * * | 每个取值都匹配,即每分钟 |
, | 列举 | 0 0,12 * | 0 点和 12 点各执行一次 |
- | 范围 | 0 9 1-5 | 周一到周五的 9 点 |
/ | 步长 | /5 * * * | 每 5 分钟;0-30/10 表示 0 到 30 之间每 10 分钟 |
/ 可以与其他写法组合。*/5 等价于 0-59/5,表示从范围起点开始每隔 5 个单位取一个值——所以它匹配的是 0、5、10、…、55,而不是「从当前时间起每 5 分钟」。这一点在跨小时、跨天时容易产生误解。
第一,日期与星期是「或」关系。* 当日期和星期**都不为** * 时,Linux cron 的判定是「满足任意一个即执行」,而不是「同时满足」。例如 0 0 1 * 1 的含义是「每月 1 号*或每个周一」的 0 点执行,而不是「每月 1 号且是周一」。想要「同时满足」,需要在脚本里自行判断。
第二,星期 0 和 7 都表示周日。 有些实现只接受 0,有些两个都接受。为了可移植,建议统一使用 0。
第三,cron 不认「每月最后一天」。 标准 cron 无法直接表达「每月 31 日」——因为 2 月、4 月没有 31 日,该月会被跳过而不是顺延到月末。需要月末执行时,通常在脚本里判断,或使用 L(仅部分实现支持)。
第四,时区问题。* cron 按*服务器所在时区执行。如果服务器是 UTC 而你想按北京时间跑,表达式里的小时需要减 8。Docker 容器默认通常是 UTC,这是「定时任务提前/延后 8 小时」的最常见原因。
第五,/N 的起点是 0 而不是当前时间。 /7 在分钟字段匹配 0、7、14、…、56,然后下一分钟是 0——所以最后一段间隔只有 4 分钟,不是均匀的 7 分钟。
第六,环境变量不同。 cron 执行时的 PATH 与登录 shell 不同,脚本里用到 node、python、php 时建议写绝对路径,否则会出现「手动执行正常、定时执行报 command not found」。
| 需求 | 表达式 |
|---|---|
| 每分钟 | * * * |
| 每 5 分钟 | /5 * * * |
| 每小时整点 | 0 * * |
| 每天 0 点 | 0 0 * |
| 每天 9 点 | 0 9 * |
| 每天 0 点与 12 点 | 0 0,12 * |
| 工作日 9 点 | 0 9 1-5 |
| 每周一 9 点 | 0 9 1 |
| 每月 1 号 0 点 | 0 0 1 |
| 每季度首日 | 0 0 1 1,4,7,10 * |
| 每年 1 月 1 日 | 0 0 1 1 * |
| 每 30 秒(6 段) | /30 * * * * |
除了数字表达式,Linux crontab 还支持一批以 @ 开头的宏,写起来更直观(本工具不生成,但可以直接在 crontab 里使用):
| 宏 | 等价表达式 |
|---|---|
@reboot | 开机时执行一次 |
@yearly / @annually | 0 0 1 1 * |
@monthly | 0 0 1 |
@weekly | 0 0 0 |
@daily / @midnight | 0 0 * |
@hourly | 0 * * |
提示:未来执行时间基于浏览器本地时区计算。部署到服务器时请确认服务器时区,避免出现时间偏差。
生成的表达式可以直接用在哪里?
@daily 这类写法支持吗?
表达式无效时会怎样?
未来执行时间是怎么算出来的?
cron 能表达「每月最后一天」吗?
为什么定时任务执行时间和预期差了 8 小时?
*/5 是从当前时间开始算 5 分钟吗?
星期 0 和 7 有区别吗?
日期和星期同时限定时是什么关系?
星号、逗号、连字符、斜杠分别是什么意思?
各字段的取值范围是多少?
Cron 表达式有几个字段?