定时表达式与调度是什么
定时表达式是把执行时间写成字段组合的语法。传统 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 日与每周一都执行。需要精确控制时只限定一个字段,把另一个条件写进脚本判断。