rsync 本身无自动重试机制,需通过脚本封装实现:区分网络类临时错误(可重试)与配置权限类永久错误(不可重试),结合退出码与 stderr 判断;采用最多3次指数退避+随机抖动重试;用 timeout、唯一id、flock 加强防护;失败后归档日志并告警。

Linux 中 rsync 本身不内置自动重试机制,但可通过脚本封装 + 条件判断 + 退避策略实现可靠重试。关键不是反复执行 rsync 命令,而是识别哪些失败值得重试、控制重试节奏、避免资源冲突,并留下可追溯线索。
区分该不该重试的错误类型
盲目重试可能加重故障或掩盖问题。需结合退出码和 stderr 内容判断:
-
适合重试:网络类临时故障,如
Connection refused、timeout、No route to host、Operation timed out -
不该重试:配置或权限类永久错误,如
Permission denied、No such file or directory、auth failed、rsync error: some files/attrs were not transferred(非网络原因)
在脚本中用 $? 获取上一条 rsync 的退出码,并用 grep 检查错误关键词:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
实现带退避的有限次重试
避免密集重试引发雪崩,采用指数退避 + 随机抖动 + 最大次数限制:
- 最多重试 3 次(覆盖绝大多数瞬时网络抖动)
- 每次等待时间递增:第 1 次等 1s,第 2 次等 2s,第 3 次等 4s(可用
sleep $((2 ** attempt))) - 加入随机抖动(如
sleep $(echo "scale=1; $((2**attempt)) * (0.8 + $RANDOM/32767*0.4)" | bc)),防止多任务同步冲撞
加防护层保障任务健壮性
单次 rsync 卡死或并发冲突会拖垮整个定时任务,需主动设防:
- 用
timeout 300s rsync ...包裹主命令,强制 5 分钟内退出 - 每次运行生成唯一 ID(如
$(date +%s)-$$),用于日志名、锁文件、临时目录,避免重试实例互相覆盖 - 用
flock防止同一任务并行执行:
exec 200>/tmp/rsync_sync.lock; flock -n 200 || { echo "$(date): locked, skip"; exit 1; }
失败后归档并触发人工介入
重试耗尽必须暴露问题,不能静默失败:
- 将原始命令、完整 stderr/stdout 日志、失败时的环境快照打包存入
/var/log/rsync/failures/下带时间戳的 tar.gz 文件 - 向邮箱或企业微信机器人发送告警,含失败时间、唯一 ID、摘要错误(如前 3 行 stderr)
- crontab 中保留基础日志重定向:
0 3 * * * /usr/local/bin/rsync_backup.sh >> /var/log/rsync/backup.log 2>&1










