事情本身不复杂,线索都在日志里。Ubuntu 20.04 的备份脚本一天执行了四遍,脚本自己写日志,四条记录相隔十几分钟,/etc/cron.daily 里有一份,root 的 crontab 里还有一份同名脚本。

排查方向其实有限,先把可能性排一排。机器每天凌晨关机,anacron 开机后发现 daily 任务错过就补跑一次。也可能是同一脚本既在 /etc/cron.daily 又在 crontab 里,两条路径各执行一次。

不容易想到的是,/var/spool/anacron 下的时间戳文件被人清过,anacron 判定当天没跑过。

先看补跑痕迹

grep -i anacron /var/log/syslog | tail -20

然后确认任务到底登记在哪几处

ls -l /etc/cron.daily/ && crontab -l

接着删掉重复的那一份

crontab -l | grep -v backup.sh | crontab -

手工跑一次并刷新时间戳

run-parts --report /etc/cron.daily

改完先别撤,确认这几项。第二天日志里该脚本只出现一次,/var/spool/anacron/cron.daily 的记录日期是当天,备份目录里没有重复文件名。

容易忽略的是,anacron 和 cron 是两套调度,最小化安装的机器上两者都在跑;长期关机的机器上,补跑是特性不是 bug,重复执行要靠脚本自己加锁。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189