我必须使用 rsync 通过 ssh 传输大量数据(>80 GB)。一切正常,但发送备份数据的 DSL 连接每 24 小时会断开一次,最长 3 分钟(无法更换提供商)。
我如何能:
连接恢复后是否自动重新开始传输?
确保不会有两个 rsync 命令同时运行?
答案1
以下内容应该会有所帮助:
#!/bin/bash
while [ 1 ]
do
rsync -avz --timeout=60 --partial source dest
if [ "$?" = "0" ] ; then
echo "rsync completed normally"
exit
else
echo "Rsync failure. Backing off and retrying..."
sleep 180
fi
done
当连接断开时,rsync 将以非零退出代码退出。此脚本只是不断重新运行 rsync,让它继续运行,直到同步正常完成。
答案2
这与 Peter 的答案非常相似,但为用户提供了选择他想要哪个远程文件以及他想要将其保存在何处(以及通过 ssh 进行 rsync)的选项。将 USER 和 HOST 分别替换为您的用户名和主机。
/bin/bash #!/bin/bash echo -e "请输入完整(转义)文件路径:" 读取-r路径 echo "路径:$path" echo -e "输入目的地:" 读取-r dst echo "目的地:$dst" 虽然 [ 1 ] 做 rsync --progress --partial --append -vz -e ssh "用户@主机:$path" $dst 如果 [ “$?” = “0” ] ; 然后 echo “rsync 正常完成” 出口 别的 echo "rsync 失败。稍后重试..." 睡眠 60 菲 完毕
这里使用的 rsync 选项启用了传输过程中的进度统计、意外故障时保存部分文件以及恢复时附加到部分完成的文件的功能。-v 选项增加了详细程度,-z 选项启用了压缩(适合慢速连接,但需要两端更多的 CPU 能力),-e 选项使我们能够通过 ssh 进行此传输(加密始终是好的)。
笔记:仅当您使用 ssh 启用了公钥登录时才使用此功能,否则它将在重新启动时要求您输入密码(终止脚本的所有功能)。
答案3
当您不想打开编辑器时,有一种快速而又肮脏的方法来做到这一点:
while ( ! rsync -avzP <source> <dest> ); do sleep 1; done
-a archive mode
-v increase verbosity
-z compress file data during the transfer
-P same as --partial --progress
答案4
@Peter 的答案似乎非常有用,但对我来说,使用--update
选项很重要。连接恢复后,如果没有--update
rsync ,则会尝试从头开始同步所有内容。使用--update
,将跳过已存在的文件。
rsync --partial --update --progress -r [SOURCE] [DESTINATION]