Cron 表达式语法详解:分时日月周一篇掌握
Cron 用 5 个字段表示分/时/日/月/周,支持 * 、逗号、连字符、斜杠。讲清常用写法与易错的星期、日互斥问题。
一、五个字段
标准 Cron 表达式从左到右:
分 时 日 月 周
- 分:0-59;时:0-23;日:1-31;月:1-12;周:0-7(0 和 7 都是周日)
*表示「每」,*/5表示「每 5 个单位」。
例:30 2 * * * = 每天凌晨 2:30;0 9 * * 1-5 = 工作日每天 9:00。
二、四种特殊符号
- 逗号:枚举。
0 8,12,20 * * *= 每天 8 点、12 点、20 点。 - 连字符:范围。
0 9-17 * * *= 9 点到 17 点每小时。 - 斜杠:步进。
*/10 * * * *= 每 10 分钟。 - L/W/#(扩展语法):L=最后一天,W=最近工作日,#8#2=8月第2个周三——注意不是所有 Cron 实现都支持。
三、日与周的互斥陷阱
经典坑:日和周同时指定时,多数 Cron 实现「或」而不是「且」。
0 0 1 * 1 不是「每月 1 号且是周一」,而是「每月 1 号 或 每个周一」执行!想让两者同时成立,在命令里自己判断(如 [ "$(date +\%d)" = "01" ] && ...)。
四、常用模板速查
- 每分钟:
* * * * * - 每 5 分钟:
*/5 * * * * - 每小时整点:
0 * * * * - 每天 0:30:
30 0 * * * - 每周一 8:00:
0 8 * * 1 - 每月 1 号 3:00:
0 3 1 * *
查看日志确认执行:grep CRON /var/log/syslog,环境变量与 PATH 与交互 shell 不同,脚本里用绝对路径最稳。
在线体验
不用装任何环境,直接用本站时间戳转换工具在线操作,数据都在浏览器本地处理,方便又安全。
常见问题
Cron 里 % 为什么报错?
百分号在 crontab 中有特殊含义(换行/ stdin 结束),命令里使用必须转义成 \%。date 命令的格式串 +\%Y\%m\%d 是最常踩的坑。
为什么我的 cron 任务不执行?
按顺序查:crontab -l 确认已加载;脚本加执行权限并写绝对路径(cron 的 PATH 很精简);输出重定向到日志文件;看 /var/log/cron 或 syslog 的调度记录。
0 0 31 * * 是什么效果?
每月最后一天?不,是「每逢 31 号」——只有大月才有 31 号,小月自然跳过。想每月最后一天可用扩展语法 L(0 0 L * *,需 cron 实现支持)。
