DevTool 团队

每分钟、每小时、每天跑一次:Cron 表达式速记与在线生成实战

定时任务到底该写哪一串?这篇按场景给答案:每分钟、每小时、每天零点、每周一早、每月一号、工作日早高峰的 Cron 表达式逐个拆解,顺带说清 crontab 5 段与 Quartz 6 段的区别、下次执行时间怎么核对。

场景先于语法

绝大多数定时需求就六七种:每分钟轮询、每小时清理、每天凌晨跑批、每周一汇总、每月一号结算、工作日早上提醒。先按场景抄表达式,再理解字段,是掌握 Cron 最快的路径。

在线 Cron 表达式工具把这条路径做成了默认动线:预设区一键填入,中文含义立即显示,下面直接给出接下来 5 次执行时间。

高频场景表达式速记

场景 表达式 说明
每分钟 * * * * * 轮询、探活
每 5 分钟 */5 * * * * 步进写法,指标采集常用
每小时(第 0 分) 0 * * * * 分钟位 0 + 小时位 *
每天零点 0 0 * * * 日志切割、跑批
每周一 9 点 0 9 * * 1 周位 1=周一(0 或 7=周日)
每月 1 号零点 0 0 1 * * 月结、账单
工作日 8:30 30 8 * * 1-5 周位区间表示周一至周五

五个字段从左到右是:分 时 日 月 周。记忆口诀「分时日月周」,范围分别是 0-59、0-23、1-31、1-12、0-7。

最高频的三个笔误

  1. 每小时写成每分钟:* * * * * 与 0 * * * * 只差一个字符,含义天差地别——前者每分钟跑一次。想清楚分钟位该填什么再写。
  2. 日和周打架:crontab 里日和周同时指定是「或」关系(任一满足即执行),不是「且」。想表达「每月 1 号且是周一」需要条件判断,单靠表达式做不到。
  3. Quartz 少写秒位:Spring 项目抄了 Linux crontab 的 5 段表达式,Quartz 调度器会直接报错——6 段开头是秒。

Quartz 与 crontab:先确认调度器

维度 crontab Quartz
段数 5(分时日月周) 6(秒+分时日月周)
最小粒度 分钟 秒
? 占位 不支持 日/周之一可用 ? 表示不指定
生态 Linux crontab 命令 Quartz / Spring @Scheduled

按调度器选格式,别让表达式跨生态。解析工具顶部有格式切换,粘贴错格式会提示。

怎么验证写对了

最快的方式是看接下来 5 次执行时间:粘进 Cron 表达式在线工具,如果列表里的时刻和你脑中的预期一致,表达式就是对的;不一致时对照中文含义和逐字段说明找差异。上线后以日志的首条执行时间为准复核一遍,跨时区部署记得按服务器时区折算。

常见问题

Cron 表达式每小时执行一次应该怎么写?

0 * * * *:分钟位填 0,小时位用 *。要在每小时的第 30 分执行就写 30 * * * *。注意分钟位写 * 会变成每分钟执行一次——这是最高频的笔误。

crontab 和 Quartz 的表达式能混用吗?

不能直接混用。crontab 是 5 段(最小粒度分钟),Quartz 是 6 段(开头多一个秒位)。Linux crontab 不认 6 段,Quartz 调度器需要秒位。写之前先确认调度器类型,解析工具按格式切换即可。

怎么确认表达式会在预期的时间执行?

把表达式粘进在线解析工具看接下来 5 次执行时间,与预期对照最快。生产环境再配合日志的首条执行时间复核;跨时区部署时注意执行时间按服务器时区计算。