我使用 rsync 命令经历了这种奇怪的行为:
sudo rsync --timeout=300 --compress-level=9 -aHe "ssh -o ConnectTimeout=200 -o ServerAliveInterval=2 -ServerAliveCountMax=200" --progress --delete -z /media/Restic/* [email protected]:/DataVolume/BACKUPS/T4-Ubuntu-Restic
几分钟后,我收到错误
rsync: [sender] write error: Broken pipe (32)
我在第二个终端窗口中测试了另一个并发 ssh 会话,运行 ping 到网关,即使 rsync 中断,它也会继续运行,只是在 rsync 中断时暂停一段时间。在我看来,Ubuntu 会终止连接一两秒,然后恢复。
我想知道为什么 rsync 上的 ssh 立即报告管道损坏,而不等待我在命令中设置的超时 200 或 300。
答案1
--bwlimit=4096 选项为我解决了这个问题
答案2
该--timeout
选项用于处理遥控器rsync
挂起或不可用的情况。它的意思是 ”在放弃远程连接之前等待这么多秒”。
如果连接被强制关闭,就像您的场景一样,则不再有任何连接,并且rsync
无法再与其对等方通信。由于它现在可以保证永远不会收到其对等方的消息,因此它会放弃并立即向您报告错误。
理想情况下,您应该调查为什么您的服务器不加区别地关闭连接。与此同时,在传输过程中设置一个循环可能会有所帮助
while :
do
rsync ... /media/Restic/ [email protected]:/DataVolume/BACKUPS/T4-Ubuntu-Restic &&
break
ss=$?
[[ -t 2 ]] && echo "Rsync failed with status $ss; retrying..." >&2
sleep 60
done