关键在于让备份任务天然互斥:用flock文件锁(crontab中加-n非阻塞参数)、systemd timer(RemainAfterExit+Persistent)、脚本幂等(唯一ID、原子操作、状态文件)及错峰超时策略。
避免多个备份任务并发运行,关键不是调得更准,而是让任务“天然互斥”——哪怕调度时间重叠、脚本意外重启、系统重启后补跑,也绝不会同时执行两个实例。
在 crontab 调度层直接加锁,不改脚本,上线快、风险低。它用内核级文件锁保证同一时刻最多一个进程持有锁。
0 2 * * * flock -n /var/run/backup.lock -c '/opt/scripts/backup-db.sh' || echo "Backup skipped"
/var/run/ 下,比 /tmp/ 更稳定)flock —— 异常退出时锁可能残留,导致后续所有任务永久失败当备份涉及生产数据库或需跨系统重启持续保障时,systemd timer 比 crontab 更健壮,它从设计上杜绝并发。
backup.service(Type=oneshot,RemainAfterExit=yes),再配 backup.timer(OnCalendar=02:00,Persistent=true)MemoryMax=512M)、超时(RuntimeMaxSec=1800)、失败重试策略systemctl status backup.timer 查下次时间,journalctl -u backup.service 看详细日志即使调度层防护到位,脚本仍应具备容错能力——这是故障恢复或手动触发时的底线。
$(date +%Y%m%d_%H%M%S)_$$),临时文件、日志、归档路径都带该 ID,避免覆盖或冲突mysqldump --single-transaction 保障一致性;落盘用 mv tmp.sql final.sql 原子操作,防止部分写入/var/lib/backup/status),含开始/结束时间、成功标记,供下次启动校验再强的锁机制,也挡不住大量长耗时任务在同一秒启动造成的 IO 或 CPU 尖峰。主动错开是成本最低的减压方式。
0 2 * * *,可分别设为 7 2 * * *、15 2 * * *、22 2 * * *
0 * * * *,改用 3 * * * *、17 * * * * 等偏移分钟timeout 3600 /opt/scripts/backup-db.sh),防止挂起任务长期占锁