0 0 * * * 到底几点跑?
问 10 个开发,8 个要盯着数半天。Cron 表达式这东西,写的人觉得简单,读的人全懵。
原因就一个:5 个位、6 种符号(*、/、-、,、?、L),排列组合太自由,没有统一记忆法。
换个思路:别记语法,记场景。下面 5 个高频任务,表达式直接抄,用时再对照语法补理解。
先花 30 秒看懂 5 位
分 时 日 月 周
| | | | |
└───┴───┘───┘───┘
第 6 位可选:年
每位的取值范围:分(0-59)、时(0-23)、日(1-31)、月(1-12)、周(0-7,0和7都是周日)。
符号速查:
*全部,枚举,9,18表示 9 点和 18 点-区间,1-5表示周一到周五/步长,*/30表示每隔 30
5 个高频场景,直接抄
场景 1:每天凌晨 2 点备份数据库
0 2 * * *
第 3、4、5 位都是 *,就是"每天都"。
场景 2:每小时执行一次健康检查
*/5 * * * *
注意是 */5(每 5 分钟)还是 */60?*/60 写法有问题,分只有 0-59,正确写法就是 0 * * * *(每小时的第 0 分钟)。
场景 3:工作日早上 9 点发日报
0 9 * * 1-5
最后一位 1-5 = 周一到周五,周末不触发。
场景 4:每月最后一天结账单
这是最容易写错的场景,因为每月的"最后一天"没固定数字。
0 0 L * *
L = Last,专门表示"当月最后一天"。别写成 28/29/30/31 取并集,平年 2 月就漏了。
场景 5:每天 8:00 和 20:00 各提醒一次
0 8,20 * * *
逗号分隔的两个小时,各触发一次。
配错了怎么快速验证
不放心就别直接写进 crontab。两步验证:
第 1 步:在线生成器可视化
用 navbox Cron 表达式生成器 填入表达式,直接显示"下次运行时间"。0 2 * * * 填进去,秒级看到下次是明天 02:00,对不对一眼确认。
第 2 步:手动触发测试
别等 24 小时验证。临时把间隔调短:
* * * * * # 每分钟跑一次,验证逻辑
观察 2 分钟没问题,再改回正式频率。这是最稳的上线方式。
一个坑:时区
Cron 按本机系统时区运行。容器里跑的服务,默认经常是 UTC,你以为 9 点是北京时间,其实是 17:00 UTC。
排查方法:先在目标机器上 date 看一眼当前时区,再决定表达式。跨地域部署的团队,这条比语法本身更重要。
下次要配定时任务,先按场景抄上面 5 条,用生成器确认下次运行时间,再上线。比死记符号快得多。