Plainnotes

时间跳变导致定时任务重复执行

2024-08-14 · 3 分钟系统

机器启动时时钟慢了半小时,chrony 同步后一次跳到正确时间。结果备份任务在几分钟内跑了两次,因为 cron 认为“错过了一次”。

cron 的行为依赖实现:Vixie cron 在时间跳变后会把错过的任务补跑,systemd timer 用 Persistent=true 也会补一次。补偿逻辑本身没错,但如果你没预期,就会出问题。

两个方向:

一,让时间不要大跳。启动时用 chrony 的 makestep 1.0 3,前三分钟内偏差超过 1 秒就平滑调整;systemd-timesyncd 默认就是渐进调整。

二,任务本身做幂等。备份脚本检查今天是否已经跑过,用锁文件或者数据库里的一行记录。

对账、扣款这类任务,幂等是必须的,不能指望时钟听话。