Cron 表达式
Cron 表达式是一串用空格分隔的字段,用来描述「在什么时间点重复执行」的规则,最早来自 Unix 的 cron 定时任务守护进程,写在 crontab 表里,如今被各种任务调度框架广泛沿用。标准(Vixie/Unix)格式为 5 个字段,从左到右依次是:分钟(0-59)、小时(0-23)、日(1-31)、月(1-12)、星期(0-7,其中 0 和 7 都表示周日)。例如 0 3 * * 1 表示「每周一凌晨 3:00 执行」。
每个字段除了写具体数字,还支持几个通配符:* 表示「任意值」,, 表示枚举(如 1,15),- 表示范围(如 9-17),/ 表示步长(如 */5 表示每 5 个单位一次)。这套语法让「每 10 分钟」「每月 1 号和 15 号」「工作日早 9 点」这类周期规则都能用一行文本精确表达。
使用时要注意几个常见误区:一是标准 cron 的最小粒度是「分钟」,没有「秒」字段,能精确到秒的是 6 字段的 Quartz/Spring 风格表达式,两者字段数和语义并不通用,照抄容易出错;二是「日」和「星期」两个字段若都不是 *,多数 cron 实现按「或」处理——满足其中任意一个即触发,而不是「与」;三是 cron 只负责触发时机,本身不保证执行成功,也不会自动补跑错过的任务。
常见问题
cron 表达式到底是 5 个字段还是 6 个字段?
标准 Unix/crontab 是 5 个字段(分、时、日、月、周),最小粒度到分钟。6 字段(甚至 7 字段)是 Quartz、Spring 等框架的扩展,在最前面多了「秒」,有的末尾还带「年」。两种风格字段数和取值语义不同,用之前先确认你的调度器属于哪一种。
同时写了「日」和「星期」,比如每月 15 号又是每周一,会怎么执行?
在传统 Vixie cron 里,只要「日」和「星期」都不是 *,两者按「或」计算——是 15 号或者是周一,任一满足就触发,而不是必须同时满足。想要「与」的效果,得靠脚本内部再判断一次。
cron 能实现「每隔 30 秒执行一次」吗?
标准 cron 不行,它的最小间隔是 1 分钟。要做到秒级,要么用支持秒字段的 Quartz 类表达式,要么在每分钟触发的脚本里用 sleep 拆分,或改用专门的秒级调度工具。