首页/系统与基础设施/自动化运维速查/定时作业表达式与调度设计
批量执行与作业50 条

定时作业表达式与调度设计

定时表达式把执行时间写成字段组合:传统 crontab 是分/时/日/月/周五段,秒级调度器(Quartz 风格)为六段。两个高频语义陷阱是日与周字段同时限定时的「或」关系,以及步长从一个区间起点起算。设计时还要确定调度器种类、时区与任务逃逸行为。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​‌​​​‌‌‌​‌​‌​‌‌​‌‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​‌​​​‌‌‌​‌​‌​‌‌​‌‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

定时表达式与调度是什么

定时表达式是把执行时间写成字段组合的语法。传统 crontab 使用五段(分 时 日 月 周),带秒精度的调度器(Quartz、Spring、部分云平台)用六段,把秒放在最前面。两个最容易踩的语义陷阱:日与周字段同时被限定为具体值时,多数实现按「或」处理而不是「与」;步长写法从一个区间的起点起算,而不是从任意数值开始。设计时还需明确使用哪种调度器、时区如何固定,以及上一次未结束时本次该怎么处理。

基本信息

字段顺序五段:分 时 日 月 周;六段(Quartz 风格):秒 分 时 日 月 周
通配符号* 任意、, 枚举、- 区间、/ 步长、? 不指定(部分实现支持)
常用别名@reboot、@daily、@weekly、@monthly(由 cron 实现提供)
时区由主机时区决定;容器与云环境常见为 UTC,需要显式确认

典型使用场景

  • 每日凌晨执行备份与日志轮转
  • 每周固定时间做全量数据校验
  • 每 5 或 10 分钟采集一次运行指标
  • 工作日特定时段启动批处理并与业务错峰
  • 需要秒级精度时改用调度框架或 systemd timer

表达式与 timer 写法

表达式与 timer 写法
# crontab 五段:分 时 日 月 周 命令
0 2 * * *      /opt/bin/backup.sh >> /var/log/backup.log 2>&1   # 每天 02:00
*/10 * * * *   /opt/bin/collect.sh                              # 每 10 分钟(含 0 分)
0 3 1 * *      /opt/bin/monthly.sh                              # 每月 1 日 03:00
30 3 * * 1-5   /opt/bin/check.sh                                # 工作日 03:30
# systemd timer:支持更细的时段表达与随机延迟
OnCalendar=*-*-* 02:30:00
Persistent=true    # 停机期间错过的任务在开机后补跑

字段取值说明

字段取值范围说明
分0-59每小时的哪些分钟
时0-23每天哪些小时
日1-31每月哪几天,与周字段可能构成或关系
月1-12 或月份名限制生效月份
周0-7(0 与 7 均表示周日)每周哪几天
秒(六段式)0-59仅秒级调度器支持
定时任务的环境变量极为精简,PATH 通常只有少数几条。脚本内应使用可执行文件绝对路径或自行设置 PATH,否则会出现手工执行正常、调度执行报找不到命令的情况。
日与周字段同时被限定为具体值时,多数实现按并集触发:0 3 1 * 1 会在每月 1 日与每周一都执行。需要精确控制时只限定一个字段,把另一个条件写进脚本判断。

易错点

  • 日与周字段同时限定并预期取交集,实际按并集触发,执行次数远超预期
  • 脚本依赖交互式 shell 的 PATH 与环境变量,调度执行时报命令不存在
  • 在 crontab 中直接使用百分号,被当作换行符处理导致命令被截断
  • 容器或云主机时区为 UTC,任务实际落在业务高峰时段运行
  • 只配定时不做并发保护,上一次未结束时又启动新实例

数据来源与参考

  • Linux 手册页 crontab(5) 与 cron(8)
  • systemd 官方文档:systemd.timer 的 OnCalendar 与 Persistent
  • Quartz Scheduler 官方文档:CronTrigger 表达式字段说明

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/cron-schedule-expression-scheduling.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​‌​​​‌‌‌​‌​‌​‌‌​‌‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​‌​​​‌‌‌​‌​‌​‌‌​‌‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​