连接断开后通过SSH恢复rsync吗?


45

我必须使用rsync通过ssh传输大量数据(> 80 GB)。一切工作正常,但是发送备份数据的DSL连接每24小时最多断开一次,持续3分钟(不选择交换服务提供商)。

我如何:

  1. 连接恢复后是否自动重新启动传输?

  2. 确保没有偶然地同时运行两个rsync命令?


您不能检查返回码吗?while ./run_script; do echo "Retrying..."; done; echo "Done."确保成功run_script回报0
Kerrek SB 2011年

可能是serverfault.com/q/98745的副本。
tanius

这里有一些有用的信息-我只想补充一下,解决“反复询问密码问题”的一种方法是使用“ sshpass”命令。与安装通常这需要apt-get的等等
瑞切尔·桑德斯

Answers:


52

以下内容将有所帮助:

#!/bin/bash

while [ 1 ]
do
    rsync -avz --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,使其继续运行直到同步正常完成。


1
谢谢,我现在正在尝试...但是应该这样做:如果[“ $?” =“ 0”]不是:if [“ $?” ==“ 0”](比较运算符)?

1
不,用bash“ =”表示字符串相等(我认为这是使它混乱的众多原因之一)
Peter

6
==是=的别名::D
bbaja42 2011年

8
啊,很高兴知道。bash永远不会停止令我惊叹/惊恐:-P
Peter Peter

2
晚到聚会了,但是为了后代:A)只需使用:if rsync -avz --partial source dest; 然后... B)如果您想比较整数值(如果使用双括号进行算术扩展):if(($?= 0))then;
user18402

7

这与Peter的回答大致相同,但是为用户提供了他想要哪个远程文件以及他想保存该文件的位置的选项(以及通过ssh进行rsync)。将USER和HOST分别替换为您的用户名和主机。

#!/ bin / bash
echo -e“请输入完整(转义的)文件路径:”
读-r路径
回声“路径:$ path”
echo -e“输入目的地:”
读-r dst
回声“目的地:$ dst”
而[1]
做
    rsync --progress --partial --append -vz -e ssh“ USER @ HOST:$ path” $ dst
    如果[“ $?” =“ 0”]; 然后
        回声“ rsync正常完成”
        出口
    其他
        echo“ rsync失败。请稍后重试...”
        睡60
    科幻
做完了

此处使用的rsync选项启用传输过程中的进度统计信息,在发生意外故障时保存部分文件,并能够在恢复时追加到部分完成的文件中。-v选项增加了详细程度,-z选项启用了压缩(对于缓慢的连接很有用,但是两端需要更多的cpu功能),-e选项使我们能够通过ssh进行此传输(加密始终是好的)。

注意:仅当您的ssh启用了公钥登录时,才使用此选项,否则重新启动时会要求您输入密码(杀死脚本的所有功能)。


1
这是原始问题的最佳答案。它也适用于答案错误的副本:serverfault.com/questions/98745/…–
rickfoosusa

5

Supervisor守护程序(过程控制管理器)在创建双方的rsa证书后可以很好地工作,其配置如下所示:(/etc/supervisor/supervised.conf是基于debian的系统上的配置文件路径)

[program:rsync-remoteserver]
command=rsync -avz --progress root@server.com:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath

1

@Peter的答案似乎非常有用,但是对我来说,使用--updateoption 很重要。恢复连接后,没有--updatersync就从一开始就尝试同步所有内容。使用--update,将跳过已经存在的文件。

rsync --partial --update --progress -r [SOURCE] [DESTINATION]


2
--update跳过已经存在的文件...包括尚未完全复制到目标的文件。我认为这与大多数用例背道而驰。
durum

@durum至少在rsync 3.1.2上不是这样。传输中断后,我看到它可以在同一文件上正常工作。我在ssh上使用了rsync,命令是rsync --partial --update file1 remotehost:file1。转移15%之后,我中断了转移(杀死-KILL)。
filiprem
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.