首页/数据/数据工程与 ETL 速查/cron 表达式基础与示例

cron 表达式基础与示例

cron 用五个字段描述分钟、小时、日、月、星期:调度平台大多兼容该语法,但扩展符(L、?、#)与“日+周”同时指定时的行为各平台不同。

cron 表达式是什么

cron 表达式用一组字段描述周期性执行时间,最经典的形式是五位:分钟、小时、日、月、星期。调度平台大多兼容这套写法,但在此基础上扩展了秒字段与 L、?、#、W 等符号,各实现的行为并不完全一致,这是跨平台迁移时最容易出问题的地方。

平台差异要留意的两处

一是字段个数:标准 crontab 是五位,Quartz 风格(部分平台采用)是六位或七位并从秒开始;二是「日」与「星期」同时限定时,多数实现的语义是「或」而不是「与」,会出现预期之外的多跑,不确定时只用一个字段。

基本信息

标准形式五位:分 时 日 月 周
扩展形式六位或七位(含秒),见于 Quartz 风格平台
常用符号* 任意、- 区间、, 枚举、/ 步长
扩展符号L 最后、? 不指定、# 第几个(平台相关)
时区以调度平台配置的时区为准,需与业务日期约定一致

字段含义

位置字段取值范围
1分钟0-59
2小时0-23
3日1-31
4月1-12
5星期0-7(0 与 7 通常表示周日)

典型使用场景

  • 日批任务:每天凌晨固定时间触发,处理前一天数据
  • 小时级任务:整点或固定分钟触发,按小时窗口产出
  • 工作日任务:只在周一到周五执行,跳过周末
  • 月度任务:每月 1 日处理上月数据,避开月末日期不存在的问题
  • 错峰编排:把多个大任务分散到不同分钟,避免同时争抢资源

常用表达式与含义

常用表达式与含义
0 2 * * *       每天 02:00
30 1 * * 1-5    周一到周五 01:30
0 */4 * * *     每 4 小时整点
15 3 1 * *      每月 1 日 03:15
*/10 * * * *    每 10 分钟
0 2 * * 6,0     周六与周日 02:00

平台扩展写法(Quartz 风格示例)

平台扩展写法(Quartz 风格示例)
# 六位形式:秒在最前
0 0 2 * * ?        每天 02:00:00,星期字段用 ? 表示不限定
0 0 2 L * ?        每月最后一天 02:00(L 表示最后一天)
0 0 2 ? * 6#3      每月第三个星期六 02:00(# 表示第几个星期几)

# 注意:这些扩展符号在不同调度平台上含义与支持范围不同,迁移前逐条验证
# 最保险的做法:不确定的写法在测试环境用真实调度跑一遍,确认触发时间
月末任务不要用「31 号触发」:2 月根本没有 31 号,直接漏跑。稳妥做法是每月 1 日触发,处理上一个自然月的数据。
平台时区与服务器时区不一致时,整个表达式的含义会整体偏移:Cron 按平台时区解释,而任务里取「当前时间」可能按服务器时区,两者叠加会出现日期错位。

易错点

  • 平台时区与服务器时区不一致,表达式含义整体偏移,任务在错误的日期处理数据
  • 月末任务写成 31 号触发,2 月等月份直接漏跑,应改为月初触发处理上月
  • 「日」与「星期」同时限定时按「与」理解,实际多数实现是「或」,导致任务意外多跑
  • 多个大任务写在同一分钟触发,资源争抢导致互相拖慢,进而超出批窗口

数据来源与参考

  • crontab(5) man 手册
  • Quartz CronTrigger 语法说明(各调度平台扩展参考)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌