错失执行的处理
错失执行指到了计划时间任务却没有运行,原因包括主机停机、调度服务未启动、时区或夏令时切换、容器实例被重建,以及调度器自身重启期间的时间窗口丢失。处理策略分两类:补跑(恢复后立即执行一次,或按周期补齐)与跳过(只等下一次到期时间)。选择依据是任务语义:备份、证书续期这类有状态且必须在时限内完成的任务需要补跑;采集指标这类时点相关的任务补跑没有意义,硬补会造成时间戳错乱。补跑的前提是任务可重复执行并能判断「这一周期是否已经完成」。
基本信息
| 常见原因 | 主机关机、调度服务未运行、时区变化、容器重建、调度器重启 |
|---|---|
| 补跑实现 | systemd 的 Persistent、anacron(按天粒度)、调度框架的 catchup 参数 |
| 跳过语义 | 只按下一次到期时间执行,不追溯已错过的周期 |
| 前提条件 | 任务幂等,且能查询最近一次成功时间 |
典型使用场景
- 非 7×24 运行的工作站需要开机后补跑备份
- 容器实例重建后需要恢复未完成的周期任务
- 云主机维护重启,错过的巡检在恢复后补跑
- 采集类任务只补最近一次,不补齐全部历史
- 证书续期类任务必须在到期前完成,错过即需告警
补跑配置与幂等判断
补跑配置与幂等判断
# systemd timer:开机后若发现错过则立即补跑一次
[Timer]
OnCalendar=daily
Persistent=true
# anacron:面向非 7x24 运行的主机,按天粒度补跑
# 1 5 cron.daily nice run-parts /etc/cron.daily
# 补跑前先判断今天是否已经成功执行过,保证幂等
ok=/var/lib/backup/last.ok
[ -f "$ok" ] && [ "$(date -r "$ok" +%F)" = "$(date +%F)" ] && exit 0
/opt/bin/backup.sh && date > "$ok"处理策略对比
| 策略 | 行为 | 适用任务 |
|---|---|---|
| 补跑一次 | 恢复后立即执行一次 | 有状态但不要求补齐历史的任务 |
| 补齐全部周期 | 按错过的次数多次执行 | 必须按周期结算的任务,如计费汇总 |
| 跳过等下一次 | 不补跑,等下一个到期时间 | 时点相关的采集类任务 |
| 告警转人工 | 只上报不自动执行 | 影响大、不宜自动决策的任务 |
补跑的前提是任务能识别「这一周期是否已完成」。用状态文件或数据库记录最近一次成功时间,比依赖调度器的记忆更可靠,因为调度器本身也可能被重建或迁移。
盲目补齐所有错过的周期会在恢复瞬间形成集中风暴(例如停机 8 小时后一次跑 8 轮),可能压垮目标系统或与业务高峰叠加,补跑同样需要限速与分批。