关键在于ssh保活与rsync断点续传:配置serveraliveinterval和serveralivecountmax维持连接,配合--partial(必选)、--append(可选)实现续传,禁用-z、限速--bwlimit、避免--delete,并用脚本重试。

在网络极差环境下,rsync 本身不直接管理连接超时,它依赖底层 SSH 或 rsync daemon 的会话稳定性。所谓“被频繁踢掉”,本质是 SSH 连接因空闲或丢包被中间设备(防火墙、NAT、云安全组)强制中断,而非 rsync 主动断开。因此,关键不是加 rsync 的 --timeout(该参数仅控制单个文件传输阶段的 IO 超时,对长连接保活无效),而是从 SSH 层加固连接,并辅以 rsync 的容错策略。
SSH 层:用保活参数对抗网络抖动
在本地 SSH 配置中为远端主机显式启用心跳机制:
-
编辑
~/.ssh/config,添加以下内容(替换your-target为目标主机别名或 IP):Host your-target<br> ServerAliveInterval 30<br> ServerAliveCountMax 5<br> TCPKeepAlive yes<br> ConnectTimeout 30
-
ServerAliveInterval 30表示每 30 秒发一次 SSH keepalive 包,防止中间设备判定为空闲连接; -
ServerAliveCountMax 5表示连续 5 次未收到响应才断开,相当于容忍约 2.5 分钟的瞬时断连; -
ConnectTimeout 30控制首次建连失败等待时间,避免卡死在不可达节点上。
rsync 层:用组合参数支撑断点续传
单纯保活还不够——一旦连接短暂中断,rsync 必须能接着干,而不是重头来:
- 必须带
--partial:保留已传部分,避免中断后全量重传; - 搭配
--append(适用于日志、镜像等顺序写大文件):只追加末尾缺失内容,比 --partial 更精准; - 加上
--progress(或-P):实时显示进度,便于人工判断是否真卡死; - 慎用
--timeout=SECONDS:它只作用于单个文件的读写操作(如某块数据 60 秒没响应就跳过),对整体连接无影响,且设太小可能误判正常慢速传输,建议仅在明确存在 IO 卡顿场景下设为 120~300。
补充策略:规避弱网下的连锁故障
极差网络常伴随高丢包和低吞吐,需同步调整行为模式:
-
禁用压缩:
-z在弱网下反而加重 CPU 负担、延长单次传输时间,增加中断概率,直接去掉; -
限制带宽:
--bwlimit=1000(单位 KB/s)可缓解拥塞丢包,让 TCP 更稳定重传,数值按实测可用带宽的 40%~50% 设; - 避免 --delete 类操作:弱网下目录扫描易超时,导致远端文件列表获取不全,引发误删;
- 用脚本封装重试逻辑:捕获 rsync 退出码(如 12, 23, 255),sleep 10 秒后自动重试,最多 3 轮,比手动干预更可靠。
不复杂但容易忽略:真正起效的是 SSH 的心跳 + rsync 的 partial 续传,两者缺一不可。超时参数只是辅助,核心是让连接“不断”、传输“可续”。











