Cron 表达式生成器
编写和读懂 crontab 计划。输入一条 cron 表达式,就能用白话看到它何时运行、接下来几次的运行时刻,以及五个字段各自的含义。
分钟
小时
日
月
星期
每分钟。
接下来的运行
时间按你电脑所在的时区()显示。cron 用的是服务器的时区,两者往往不同。
常用计划
选一条即可填入上面的输入框。
| * * * * * | 每分钟 |
| */5 * * * * | 每 5 分钟 |
| */15 * * * * | 每 15 分钟 |
| */30 * * * * | 每半小时 |
| 0 * * * * | 每小时 |
| 0 */2 * * * | 每 2 小时 |
| 0 */6 * * * | 每 6 小时 |
| 0 */12 * * * | 每天两次 |
| 0 0 * * * | 每天午夜 |
| 0 9 * * * | 每天上午 9 点 |
| 0 9 * * 1-5 | 工作日上午 9 点 |
| 0 9 * * 6,0 | 周六和周日 9 点 |
| 0 0 * * 1 | 每周一午夜 |
| 0 18 * * 5 | 每周五下午 6 点 |
| 0 0 1 * * | 每月第一天 |
| 0 0 1 1 * | 每年第一天 |
每个字段的含义
| 字段 | 可用取值 |
|---|---|
| 分钟 | 0 – 59 |
| 小时 | 0 – 23 |
| 日 | 1 – 31 |
| 月 | 1 – 12, JAN – DEC |
| 星期 | 0 – 6, SUN – SAT (0 = 7) |
特殊符号
| 符号 | 含义 |
|---|---|
| * | 任意值 |
| , | 分隔列表中的取值 |
| - | 一段取值范围 |
| / | 范围内的步长 |
简写
| @yearly, @annually | 0 0 1 1 * |
| @monthly | 0 0 1 * * |
| @weekly | 0 0 * * 0 |
| @daily, @midnight | 0 0 * * * |
| @hourly | 0 * * * * |
| @reboot | — |
它们不属于 POSIX 的 cron,但几乎所有实现都接受。
最容易踩的坑
- 当“日”和“星期”都被限定时,cron 会在符合其中任意一个的日子运行,而不是两个都符合。“* * 3 * 1”在每月 3 日和每个周一都会运行。例外是其中一个以星号开头:“* * */2 * 1”只在既是单数日又是周一的那天运行。手册页在这一点上写错了。
- 把服务器连同 cron 一起跑在 UTC 上。写在有夏令时的时区里的计划,每年会漏掉一次运行,并在下一次切换时重复一次。
- 标准 cron 没有秒和年的字段。如果你需要那种精度,cron 就不是合适的工具。
- 避开 @reboot。它取决于机器是如何重启的、那一刻哪些服务已经就绪,因此很难推断。
- 五个字段装不下的计划,可以拆成两条。想每 90 分钟运行一次,就把“0 */3 * * *”和“30 1/3 * * *”并排写上。
- 命令要写绝对路径。cron 的 PATH 非常短,而且几乎没有你的 shell 里那些环境变量。
Cron 表达式常见问题
五个字段分别是什么?
依次是:分钟、小时、日、月、星期。带星号的字段匹配任意取值。
星期日是 0 还是 7?
都可以。多数实现的星期日既接受 0 也接受 7,也接受 SUN 到 SAT 的三字母写法。
我的任务为什么没在预期的时间运行?
常见原因是服务器在另一个时区、上面讲的“日”与“星期”规则,或者因为 cron 不加载你的 shell 配置而导致命令失败。
这个页面会把我的表达式发到别处吗?
不会。表达式的解析和运行时刻的计算都在你的浏览器里完成,不会上传任何内容。