我已经rsync
尝试连接五次了。我收到退出代码 11,指示文件 I/O 错误。当我尝试使用时,robocopy
将一组文件复制到同一目标时收到错误 59。
问题是失败的robocopy
地方会成功rsync
,当我查看robocopy
日志时,我注意到它在收到错误后立即重试了 30 秒。我需要使用rsync
,所以我想知道如何设置rsync
在 30 秒后重试网络错误。在传输超过 200K 的不同大小的文件时,这种情况只会发生 5 次。当我在代码 11 之后立即查看 rsync 日志时,它立即请求从源获取文件列表,并以相同的退出代码 11 退出,这表明它失败了。
命令行
rsync -rtlzv -e "ssh -i c:/RsyncKeys/wa-ecy-gov-test-rsync-key -o ConnectTimeout=140 -o ConnectionAttempts=18" --quiet --stats --exclude-from='rsyncfilter.txt' --force --delete [email protected]: //sdceco/Apps/RSTUDIO/RpackagesNew --timeout=320 --log-file=c:/rsynclogs/rsync11-05-2020.log
非常感谢您的任何建议!
答案1
我的做法与此类似
while :
do
rsync … && break
sleep 60
done
当工具成功完成时,它rsync
会以状态 0(成功)退出,从而跳出循环。否则,会有 60 秒的暂停并重新开始循环。在我自己的实现中,我倾向于使用更长的延迟以及一个计数器来在k
尝试后退出循环:
ss=127 k=4
while [[ $((k--)) -gt 0 ]]
do
rsync … && ss=0 && break
ss=$?
[[ $k -gt 0 ]] && sleep 300
done
echo "completion status of last rsync is $ss"
最近我遇到了retry
(至少)Debian 中可用的命令。因此可以大大简化循环代码:
retry --delay 60 --time 4 rsync …
ss=$?
echo "completion status of last rsync is $ss"
在您的问题更新后,这是rsync
我将使用的命令
rsync -rtlzq -e "ssh -i c:/RsyncKeys/wa-ecy-gov-test-rsync-key -o ConnectTimeout=140 -o ServerAliveInterval=15" --exclude-from='rsyncfilter.txt' --force --delete --log-file=c:/rsynclogs/rsync11-05-2020.log [email protected]: //sdceco/Apps/RSTUDIO/RpackagesNew
变化
- 添加了传输
ServerAliveInterval=15
功能,ssh
以在 45 秒没有服务器响应后强制断开连接 - 否
-v
(--verbose
) 或--stats
因为您用-q
(--quiet
)覆盖了它们 - 否
--timeout
,因为它是ssh
在传输级别管理的 - 这复制说明对于 R 警告,可能需要在 Windows 文件系统上
-l
替换为。-L
我没有在这里进行更改,但您(和未来的读者)应该意识到这一点