错过的任务是什么问题
传统 cron 按时间点触发,机器关机或长时间高负载错过的时间点不会被补跑,任务就这么永久丢失。需要补跑能力时有两类方案:按天粒度的批任务可以交给 anacron,它记录上次执行时间,机器恢复运行后补做;精确到小时甚至分钟的补跑要用 systemd 定时器配合持久化选项,它在开机后检查上次触发时间并立即补一次。理解这个差别,才能回答「机器停机两天,备份有没有补跑」。
基本信息
| 适用平台 | GNU/Linux(cron 与 anacron,或 systemd 定时器) |
|---|---|
| 传统 cron | 不补跑,错过的触发点永久丢失 |
| 补跑方案 | anacron 或定时器的持久化选项 |
| 补跑粒度 | anacron 只处理天级批任务,小时级用定时器 |
| 记录位置 | anacron 的上次执行时间戳文件 |
| 校验手段 | 校验配置并立即补跑一次 |
典型使用场景
- 回答「机器关机期间错过的备份是否补跑过」。
- 给重要的每日批任务配置补跑能力。
- 排查周期性任务为何某天没有执行。
- 评估是否需要把天级任务从 cron 迁移到带持久化的定时器。
- 长期停机的服务器恢复后确认补跑的顺序与错峰。
检查与补跑
检查与补跑
cat /var/spool/anacron/cron.daily # 查看上次执行日期(Debian 系)
sudo systemctl status anacron --no-pager | head # 确认 anacron 是否启用
sudo anacron -T # 校验 anacrontab 配置
sudo anacron -f -n cron.daily # 立即补跑每日任务
crontab -l | head # 查看当前用户的 cron 任务
sudo journalctl -u cron --since today --no-pager | tail -20 # 触发记录机制对照
| 机制 | 补跑能力 | 使用要点 |
|---|---|---|
| 传统 cron | 不补跑 | 错过的触发点永久丢失 |
| anacron | 天级补跑 | 只处理每日、每周、每月粒度 |
| systemd 定时器 | 可配置补跑 | 配合持久化选项实现开机补跑 |
| 时间戳文件 | 记录上次执行 | 判断是否补跑过的直接证据 |
| 校验参数 | 检查配置 | 改完先校验再让策略生效 |
| 日志 | 确认触发 | 结合调度日志与脚本自身日志 |
anacron 只补天粒度的批任务:小时级或精确时间点的补跑必须用带持久化选项的定时器,两者的适用场景不能互换。
长期停机的服务器恢复后可能集中补跑多个任务:要注意错峰与依赖顺序,避免补跑风暴把 IO 与带宽打满。
判断是否补跑过要看时间戳文件与脚本自身日志两处证据,只看调度器日志无法确定脚本真的执行成功。