定时任务 cron 表达式五个易错点
【摘要】 梳理 cron 表达式五类高频踩坑:字段位数、日周冲突、步长起点、时区与补跑策略,附可直接复制的正确写法与规避建议。
一、五位与六位字段别混用
Linux crontab 是 5 位(分 时 日 月 周),Quartz、Spring 等调度框架是 6 位,多一个秒字段。跨框架复用表达式时,轻则整体错位一档,重则直接抛错,务必先核对位数。
二、日与周不能同时指定
Quartz 强制日与周二选一,必须有一个写 ?,否则启动即报错;Linux crontab 允许同时指定,但语义是或——每月 1 号或每周一都会触发,与多数人直觉的“且”相反。
# Quartz:周一至周五 02:00
0 0 2 ? * MON-FRI
# Linux crontab:日=1 且 周=1,实际 1 号或周一都执行
0 2 1 * 1
三、步长起点与月末表达
分钟字段 */5 表示从 0 起每 5 分钟触发(0、5、10……),不是从任务启动时刻计时。cron 原生写不出“每月最后一天”:Quartz 可用 L;Linux 常在月末几天加条件判断绕过,注意 crontab 中百分号必须转义为 \%。
# Quartz:每月最后一天 23:30
0 30 23 L * ?
# Linux:28~31 号当天,若明天是 1 号则执行
30 23 28-31 * * [ $(date -d tomorrow +\%d) -eq 1 ] && /opt/task.sh
四、时区由运行环境决定
cron 按实例本地时区触发,同一表达式在不同地区的节点上会相差数小时,容器环境尤其常见。跨时区业务应在框架或调度平台层面显式指定时区,不要依赖宿主机默认值。
五、错过的点不会补跑
停机或线程池占满期间错过的触发点,cron 不会自动补执行。需要补偿的场景,要么配置调度框架的 misfire 策略,要么把任务设计成幂等并配合对账兜底。
建议:上线前逐条用本地解析工具或在线校验器验证表达式,并把位数、日周二选一、百分号转义、时区、补跑策略列入代码评审清单。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)