每分钟一次的任务 日志里同一批数据处理了两遍 两个进程的时间戳几乎重合 数据库里出现两条一模一样的流水 金额也被扣了两次。日志里能对上时间点,这种反而好排。

锁文件放在 /tmp 被系统定期清理 锁又只包住最外层那个判断 真正的处理函数 fork 出去已经不在锁内 两个进程就并排跑了谁也没拦住谁。这一点先确认清楚,后面就不用反复试。

*/1 * * * * /usr/bin/flock -n /var/lock/sync.lock \
  /bin/bash /opt/scripts/sync.sh >> /var/log/sync.log 2>&1

围绕「crontab 任务重叠」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

处理上按这个顺序:锁文件放到 /var/lock 用绝对路径 避开会被清理的临时目录;用 flock -n 包住整条业务命令 不要只包住最外层的一句判断;拿不到锁时记一行日志再退出 别静默等下一轮调度。

结果对不对很好判断,同一时刻只有一个进程持有锁 另一路日志里能看到拿锁失败后直接退出。

作者 9823189