Cron表达式速查:5分钟掌握定时任务写法
你是不是也遇到过这种情况:
同事让你配一个"每天凌晨2点跑备份"的定时任务。你打开 crontab 编辑器,手写了 0 2 * * *,结果发现任务根本没执行。排查半天才发现,服务器上装的是非标准 cron,格式完全不同。
或者你接手了一个旧项目,配置文件里写着 30 4 * * 1-5,你猜它是什么意思?每天凌晨4点半?不对,那是 30 4 * * *。这个表达式其实是"每周一到周五凌晨4:30执行"。
Cron 表达式看着简单,但稍微复杂一点的场景就容易写错。今天这篇,帮你彻底搞懂它。
Cron 表达式的 5 个字段
标准 Cron 表达式由 5 个字段组成,用空格分隔:
┌───────────── 分钟 (0 - 59)
│ ┌───────────── 小时 (0 - 23)
│ │ ┌───────────── 日 (1 - 31)
│ │ │ ┌───────────── 月 (1 - 12)
│ │ │ │ ┌───────────── 星期 (0 - 7, 0和7都是周日)
│ │ │ │ │
│ │ │ │ │
* * * * *
每个字段的取值范围:
| 字段 | 取值范围 | 示例 |
|---|---|---|
| 分钟 | 0-59 | 30 表示整点过30分 |
| 小时 | 0-23 | 2 表示凌晨2点 |
| 日 | 1-31 | 15 表示每月15号 |
| 月 | 1-12 | 6 表示6月 |
| 星期 | 0-7(0和7都是周日) | 1-5 表示周一到周五 |
常用特殊字符
Cron 表达式不是只能写死数字,有 4 个特殊字符很好用:
*通配符,表示"每一"。比如* * * * *就是每分钟执行一次,枚举多个值。1,3,5表示第1、3、5天-表示范围。1-5表示从1到5/表示间隔。*/2表示每隔2个单位
举个例子:
*/5 * * * *— 每5分钟执行一次0 9-18 * * 1-5— 工作日上午9点到下午6点的整点执行30 2 1 * *— 每月1号凌晨2:30执行0 0 1 1,6,12 *— 每年1月、6月、12月的1号零点执行
常见场景速查表
下面这 10 个是最常用的定时任务写法,直接复制就能用:
| 场景 | Cron 表达式 | 说明 |
|---|---|---|
| 每分钟执行 | * * * * * | 最简单,但也最耗资源 |
| 每5分钟执行 | */5 * * * * | 适合轻量级健康检查 |
| 每小时执行 | 0 * * * * | 整点触发 |
| 每天凌晨2点 | 0 2 * * * | 备份、日志轮转常用 |
| 每周一早上9点 | 0 9 * * 1 | 周报生成、周数据汇总 |
| 每月1号零点 | 0 0 1 * * | 月度报表、账单生成 |
| 每季度最后一天 | 0 0 28-31 * 5 | 注意:这个写法有缺陷,详见下文 |
| 工作日凌晨1点 | 0 1 * * 1-5 | 周一到周五,不含周末 |
| 每隔3小时 | 0 */3 * * * | 适合缓存刷新 |
| 每年元旦零点 | 0 0 1 1 * | 年度数据归档 |
注意:上面的"每季度最后一天"写法其实不准确。28-31 会匹配到2月29日、4月31日(不存在)等无效日期。如果要精确匹配季度末,建议用脚本判断或直接指定 0 0 31 3,6,9,12 *。
两个容易踩的坑
坑1:周日到底是0还是7?
标准 Cron 里,周日可以用 0 或 7 表示。但有些实现(比如 macOS 的 cron)只认 0,不认 7。
如果你想写"每周日和每周一执行",稳妥的写法是 0 0 * * 0,1,而不是 0 0 * * 7,1。
坑2:日字段和星期字段不能同时用 *
这是最常见的错误之一。比如你想写"每周一到周五的凌晨2点",有人可能会写成 0 2 * * 1-5,这是对的。
但如果你写成 0 2 * * *,那就是每天凌晨2点,不是每周一到周五。
反过来,0 2 1 * * 是每月1号的凌晨2点,跟星期几没关系。
记住一条规则:当"日"和"星期"两个字段都不是 * 时,Cron 的行为取决于具体实现。有的实现是"或"的关系(满足任一就执行),有的是"与"的关系(必须同时满足)。为了避免混淆,尽量只用一个字段来限定日期。
实战:用 navbox 工具验证你的 Cron 表达式
写 Cron 表达式最怕什么?写完了不知道对不对。
这里推荐两个在线工具:
Cron 表达式生成器 — 可视化点选,自动生成表达式。适合不熟悉语法的同学。选"每天"→“凌晨2点”,它直接输出
0 2 * * *。Cron 表达式解析器 — 输入一个表达式,告诉你下次执行时间。比如输入
30 4 * * 1-5,它会列出接下来 5 次执行的具体日期和时间,帮你确认没写错。
这两个工具配合着用,基本不会出错。
进阶:Windows 任务计划器的区别
如果你的定时任务跑在 Windows 上,用的是任务计划器(Task Scheduler),那 Cron 表达式就不适用了。
Windows 任务计划器有自己的触发器设置界面,虽然也能做到类似的效果,但语法完全不同。比如"每天凌晨2点"在 Windows 上是通过图形界面勾选"每天"、“起始时间 02:00"来实现的。
如果你需要在 Windows 上运行 Cron 风格的定时任务,可以考虑安装 Cygwin 或者 WSL,然后在 WSL 里用标准的 Linux cron。
总结
Cron 表达式不难,关键记住三点:
- 五个字段从左到右分别是:分、时、日、月、周
*、,、-、/四个特殊字符覆盖 90% 的场景- 不确定表达式对不对?用解析器工具验证一下
最后留个小练习:如果你想让某个任务"每个月的最后一个星期五凌晨3点执行”,Cron 表达式该怎么写?提示:这个没有完美的 Cron 写法,需要用脚本判断。
欢迎在评论区讨论你的答案。