cron 如何每 5、10、15 或 30 分钟运行一次?
cron 按固定间隔分钟运行的写法:分钟字段用步长 */5、*/10、*/15、*/30;附步长与逗号列表的区别、五字段速查表与 FAQ。
用"步长"语法:分钟字段写 */N。例如每 5 分钟一次:
*/5 * * * * /path/to/command
各间隔写法对照
| 需求 | crontab 行 |
|---|---|
| 每 5 分钟 | */5 * * * * cmd |
| 每 10 分钟 | */10 * * * * cmd |
| 每 15 分钟 | */15 * * * * cmd |
| 每 30 分钟 | */30 * * * * cmd |
| 每小时整 | 0 * * * * cmd(注意不是 * * * * *) |
语法原理
五个时间字段:
.---------------- 分钟 (0-59)
| .------------- 小时 (0-23)
| | .---------- 日 (1-31)
| | | .------- 月 (1-12)
| | | | .---- 星期 (0-6,0=周日)
* * * * * 要执行的命令
*:任意值,每分钟/每小时都匹配。*/N:从 0 开始、每隔 N 匹配一次——*/5命中 0、5、10、15……55 分。- 也可以用枚举达到同样效果:
0,5,10,15,20,25,30,35,40,45,50,55 * * * *,但*/5简洁得多。
常见变体
- 只在工作时间每 10 分钟:
*/10 9-18 * * 1-5(周一到周五 9-18 点)。 - 每小时的第 7 分开始每 10 分钟:
7-59/10 * * * *(7、17、27、37、47、57 分)。 - 注意间隔漂移:
*/5是"对齐整点"的(0、5、10……),不是从任务启动时刻算起。
观测云对照
高频巡检任务(每 5 分钟一次)最怕的是"默默停掉"——不报错,只是不再执行。把任务的标准输出/退出码落到日志并用 DataKit 采集,在观测云配一条监控器:任意 10 分钟窗口内没有该任务的成功记录就触发告警,等于给 cron 加了心跳。若任务本身慢到超过间隔导致重叠,参考 flock 防重入的写法。
常见问题(FAQ)
Q:*/5 和 5 在分钟字段有什么区别?
A:*/5 是每 5 分钟(0、5、10……55 分都跑);单独的 5 只在每小时第 5 分钟跑一次。
Q:步长能写在别的字段吗?
A:可以。0 */2 * * * 是每 2 小时;0 0 */3 * * 是每 3 天。五个字段都支持 */N 与 a-b/N。
Q:任务执行时间超过间隔会怎样?
A:cron 不会等你,照样按点启动新进程,可能多个实例并发。用 flock -n /tmp/job.lock cmd 保证同一时刻只有一个在跑。