实现多路径备份需编写统一脚本,依次向本地、nas、远程等目标执行独立备份操作,每步校验状态并记录日志,预检路径可用性,支持重试与差异化清理策略。

实现多路径备份,核心是让一个脚本能同时向多个目标位置写入相同内容,而不是只备份到单一目录。关键不在 cron 本身,而在备份脚本的设计逻辑——它要能依次执行多个独立的备份动作,并各自处理路径、命名和清理。
编写支持多路径的备份脚本
脚本需显式定义多个目标路径(如本地磁盘、NAS挂载点、远程服务器),对每个路径单独调用备份命令。避免使用硬编码路径,改用变量提升可维护性。
- 在脚本开头声明多个备份目标:# 备份路径列表
LOCAL_BACKUP="/backup/local"
NAS_BACKUP="/mnt/nas/backup"
REMOTE_BACKUP="user@192.168.1.100:/backup/remote" - 对每个路径分别执行 tar 或 rsync。例如用 rsync 推送远程时加 -a --delete 保证一致性;本地用 tar 压缩并加时间戳:
DATE=$(date +%Y%m%d_%H%M)
tar -czf "$LOCAL_BACKUP/data_$DATE.tar.gz" /data
rsync -a --delete /data/ "$NAS_BACKUP/data/"
rsync -az --delete /data/ "$REMOTE_BACKUP/data/" - 每步后检查返回值,记录成功或失败到日志,便于排查哪一路出错:
if [ $? -eq 0 ]; then echo "[$(date)] NAS backup OK" >> /var/log/multi-backup.log; else echo "[$(date)] NAS backup FAILED" >> /var/log/multi-backup.log; fi
确保各路径可用且权限正确
多路径意味着依赖更多外部条件:本地目录需存在且可写;NAS 挂载点需已 mount 且未断连;远程主机需配置免密 SSH 登录。cron 环境下这些常被忽略。
- 脚本开头加入预检逻辑:
[ ! -d "$LOCAL_BACKUP" ] && mkdir -p "$LOCAL_BACKUP"
[ ! -d "$NAS_BACKUP" ] && { echo "NAS not mounted"; exit 1; }
timeout 5 ssh -o ConnectTimeout=5 -o BatchMode=yes $REMOTE_BACKUP 'exit' || { echo "Remote host unreachable"; exit 1; } - 所有路径使用绝对路径;避免依赖当前工作目录。建议脚本以 cd / && 开头,消除路径歧义。
通过 crontab 触发并控制并发与重试
单次 cron 调度运行整个脚本,但若某路径失败(如网络波动导致 rsync 超时),可加入简单重试机制,避免全盘失败。
- 为远程备份添加最多两次重试:
for i in {1..2}; do rsync -az --delete /data/ "$REMOTE_BACKUP/data/" && break || sleep 30; done - 在 crontab 中设置合理间隔,避免高频触发引发 I/O 压力。例如每天 2:30 执行:
30 2 * * * /usr/local/bin/multi-backup.sh >> /var/log/multi-backup.log 2>&1 - 不建议把多个路径拆成多个 cron 条目——时间不同步、状态难统一、日志分散。一个脚本 + 一次调度更可控。
自动清理各路径下的旧备份
不同路径可能使用不同保留策略(如本地留7天、NAS留30天、远程留90天),清理逻辑应嵌入脚本内部,按路径分别处理。
- 用 find 按路径和天数清理:
find "$LOCAL_BACKUP" -name "data_*.tar.gz" -mtime +7 -delete
find "$NAS_BACKUP/data" -mindepth 1 -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \; - 清理前先统计数量,防止误删:
OLD_COUNT=$(find "$LOCAL_BACKUP" -name "data_*.tar.gz" -mtime +7 | wc -l)
[ "$OLD_COUNT" -gt 0 ] && echo "Removing $OLD_COUNT old backups..." && find ... -delete











