设置 rsync 重试之间的固定时间

设置 rsync 重试之间的固定时间

我已经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我没有在这里进行更改,但您(和未来的读者)应该意识到这一点

相关内容