补偿错过的任务是什么
计划内维护或意外重启后,必须回答三个问题:哪些任务错过了执行窗口、哪些确实需要补、补完怎么确认。原则是先查执行记录再决定补跑,补跑动作必须幂等,全过程可审计。
基本信息
| 场景 | 维护窗口或非计划重启导致任务错过触发时间 |
|---|---|
| 工具 | anacron 补天粒度任务、systemd timer 的 Persistent、手动触发 |
| 前提 | 任务幂等;非幂等任务先查唯一键或执行记录 |
| 确认 | journalctl 查单元日志,业务侧核对自身执行记录 |
典型使用场景
- 计划维护:窗口结束后按清单核对哪些任务需要补跑
- 意外宕机:先看上次成功执行记录,再确定补跑范围
- 带唯一键的业务任务:先确认当日是否已执行,避免重复发通知或重复扣款
- 备份类任务:天然可重入,可直接补最新一次,逐日数据缺口另行处理
- 机器迁移:把旧机任务表归档成清单,逐条在新机验证后再下线旧机
盘点与补跑
盘点与补跑
systemctl list-timers --all --no-pager # 1. 看上次与下次触发,找出错过的
sudo anacron -d -n # 2. 干跑:只显示将执行什么
sudo anacron -f -n # 3. 强制执行,补跑过期的天粒度任务
sudo systemctl start backup.service # 4. timer 对应任务手动触发一次
systemctl status backup.service --no-pager # 5. 核对执行结果
journalctl -u backup.service --since today --no-pager | tail -n 20确认记录点
确认记录点
ls -l /var/lib/systemd/timers/ # timer 上次触发时间戳(Persistent 记录点)
cat /var/lib/systemd/timers/stamp-backup.timer
crontab -l | grep -c '^[^#]' # 另有 cron 任务时,清点非注释行数量按任务类型选择补法
| 任务类型 | 补跑方式 | 风险 |
|---|---|---|
| 天粒度批处理 | anacron -f -n 强制执行 | 低,前提是脚本可重入 |
| timer 定时任务 | Persistent 自动补或手动 start | 只补最近一次,不逐日补 |
| 业务类任务 | 查唯一键后人工补 | 重复执行会产生业务副作用 |
| 备份任务 | 补最新一次 | 逐日版本缺口需增量方案另行处理 |
补跑的前提是幂等:备份、同步类天然可重入;发通知、扣款、下单类必须先查执行记录。
timer 的 Persistent=true 只会补最近一个错过的时点,要逐日补齐需要脚本内部按日期检查缺口。
维护结束后若多个 timer 同时到点触发会形成资源尖峰,用 RandomizedDelaySec 错峰。