五个字段的顺序
从左到右依次是分钟、小时、日期、月份、星期。0 9 * * 1的意思是分钟为 0、小时为 9、日期和月份都不限、星期为周一,也就是每周一早上九点执行。
星号表示这个字段没有限制。越靠前的字段写成星号,任务跑得越频繁,* * * * *就是每分钟一次。要是不小心把分钟字段写成星号,一天会跑 1440 次。
符号怎么读
1-5是从 1 到 5 的连续取值。1,3,5只取这三个值。*/15从 0 开始每隔 15 取一次。放在分钟字段就是 0、15、30、45。9-17/2只在给定范围内跳着取。- 星期和月份也能写名字,比如
MON-FRI、JAN,JUL。
星期字段里 0 是周日,6 是周六。多数实现也接受 7 表示周日,所以0和7指的是同一天。
同时写日期和星期时
这是最容易搞错的地方。第三个字段(日期)和第五个字段(星期)都给了值时,cron 不是在两个条件同时满足的日子执行,而是任意一个对上就执行。
0 0 1 * MON不是“每月一号且恰好是周一”,而是“每月一号,或者每个周一”,一个月大概会跑五次。只限定其中一个、另一个留成星号,就能避开这个坑。
先确认时区
这里显示的下次执行时刻,按你当前设备的时区计算。服务器上的 cron 走服务器自己的时区,所以部署之前先确认那台机器是什么设置。保持 UTC 的服务器很常见,本想让任务在早上九点跑,结果落到了下午。
在有夏令时的地区,调表那天落在被拨动那一小时的任务可能被跳过,也可能跑两遍。把任务从凌晨两点前后挪开就能绕过这个问题。
六个字段是另一套写法
有些表达式最前面多一个秒字段,一共六个。那是 Spring 和 Quartz 的写法,和标准 crontab 不是一回事。这个工具只读五个字段。
把六字段的式子直接塞进 crontab,每个字段都会错位一格:本来当秒写的值被当成分钟,分钟被当成小时,于是在完全不对的时间执行。复制之前先弄清目标用的是哪一套语法。