首页/系统/Linux 运维命令速查/场景:重启/停机后补偿错过的任务
定时任务与计划50 条

场景:重启/停机后补偿错过的任务

维护窗口后要回答「哪些任务该补、怎么补」:anacron 管天粒度、timer Persistent 自动补、业务型任务按业务口径人工补。

Linux 运维命令速查系统更新于 2026-10-13

补偿错过的任务是什么

计划内维护或意外重启后,必须回答三个问题:哪些任务错过了执行窗口、哪些确实需要补、补完怎么确认。原则是先查执行记录再决定补跑,补跑动作必须幂等,全过程可审计。

基本信息

场景维护窗口或非计划重启导致任务错过触发时间
工具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 错峰。

易错点

  • 盲目补跑非幂等任务会重复发通知或重复扣款,业务任务必须有唯一键或执行记录表
  • anacron 只处理 /etc/anacrontab 中定义的天、周、月粒度任务,分钟级 cron 任务不会因它补跑
  • 补跑后不核对执行结果就宣布恢复,真实失败原因要等下一个周期才暴露
  • 长时间关机后开机瞬间多个 timer 同时触发,会争抢 IO 与网络,需要错峰与限速

数据来源与参考

  • man 8 anacron
  • man 5 systemd.timer(Persistent)
  • systemd 官方文档:timers

相关工具

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