如何反复调用rsync,直到文件成功传输


27

我正在尝试从不可靠的远程服务器同步文件,这意味着连接往往会“随机”失败

rsync:连接意外关闭

Rsync是通过--partial调用的,因此我希望能够在循环中调用rsync,直到文件完全传输为止。似乎没有标志告诉rsync重试。

编写脚本的最佳方法是什么?一个bash for loop?


1
尽管下面的答案很有帮助,但找出故障原因并使其停止可能是一个更好的主意。我假设您控制着服务器,客户端和网络之间的网络,因此您可以在各个地方运行tcpdump来查看如何关闭它。也许您的防火墙或VPN设备之一正在关闭连接?
MarkR 2010年

它连接到的服务器是共享主机,因此我没有root访问权限。我可能会研究为什么它会关闭,但是现在我很高兴能重试它。无论如何,还是感谢大家的单挑
Bruno Lopes 2010年

我震惊地发现rsync实际上没有重试的功能!
迈克尔

rsync --partial --append确实能够手动重试或在脚本中重试返回代码。副本:superuser.com/questions/302842/…–
rickfoosusa

Answers:


29

如果要一次同步所有内容,请循环调用rsync,直到rsync给您成功的返回码。

就像是:

RC=1 
while [[ $RC -ne 0 ]]
do
   rsync -a .....   
   RC=$?
done

这将循环,调用rsync,直到返回码为0。您可能要在其中添加睡眠以防止DOS对服务器的访问。


28
你可以写一会儿!rsync -a ....;睡5;完成
贾斯汀2010年

1
请小心使用方式,例如,如果尝试通过cron运行它,则可能会遇到并发问题。
凯兰霍洛威(Keiran Holloway)2010年

3
如果存在非暂时性错误(例如,读取或写入文件的权限错误),它将变成无限循环。我建议检查rsync的退出状态是否存在特定的网络错误,例如RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](或从网络掉线中看到的任何退出状态)。
戈登·戴维森

1
由于我不是在完全无人值守的情况下运行,因此无限循环和并发并不是什么大问题,谢谢。
布鲁诺·洛佩斯

2
令人遗憾的是rsync没有内置此功能,因为在没有自动身份验证或适当身份验证的情况下,任何基于shell的循环都会提示输入密码。
迈克尔


1

用sshpass清除所有内容

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.