我需要将目录同步到远程服务器上的目录。目前,我使用rsync -ca进行此操作,但是目录相当大,整个进程都失败了,出现了超时错误。
现在,我正在寻找一个文件通过文件同步,而不是‘所有一次’的方法。比如find,并为每个找到的服务器找到rsync。做这件事最容易的方法是什么?
我得到以下错误:
receiving incremental file list
Write failed: Broken pipe
rsync: connection unexpectedly closed (1175057 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(601)[receiver=3.0.7]
rsync: connection unexpectedly closed (287 bytes received so far) [generator]
rsync error: unexplained error (code 255) at io.c(601) [generator=3.0.7]发布于 2013-03-22 16:24:17
看起来服务器在SSH连接级别上超时了。
因此,我添加了以下设置:
KeepAlive yes
ServerAliveInterval 20
ServerAliveCountMax 6对于/etc/ssh/ssh_config (或~/.ssh/config)来说,现在看起来很有希望。
发布于 2013-03-22 09:59:09
更新:由于超时似乎发生在rsync创建校验和时,以下是几种可能有效的不同方法。
首先,为了只打开一个rsync,您可以(除了Michael rling提到的选项之外)使用--sockopts选项。这使您能够设置在代码中创建套接字时可以设置的相同类型的套接字选项,例如SO_RCVTIMEOUT=0来禁用接收数据的超时。
其次,通过不断发送进度信息,--progress-file选项可能不足以触发超时。
第三,您可以逐文件同步,例如:
for i in ls /path/to/dir; do rsync -ca $i remoteserver:/path/to/dir; done第四,您可以使用ssh作为传输机制,并以某种适当的方式使用它的TCPKeepAlive和ServerAliveInterval/ServerAliveCountMax选项来保持连接的活力。
原始答案: rsync已经执行了一种逐文件的方法-它将检查要同步的文件列表中的每个文件,并且只同步那些在目标系统中不存在的文件,或者与目标系统中的文件不同的文件。
为了减少传输时间,您可以使用选项-z,它将在传输期间进行压缩,并使用标志--partial,以便如果传输被中断,您将保留任何部分同步的文件,以便rsync能够在原来的位置继续。此外,Michael rling提到的--超时和-contimeout选项可能会很有用。
发布于 2013-03-22 09:26:09
也许是这样的?
find . -type f -exec 'rsync' '{}' ';'这将对当前目录下的每个常规文件执行一次rsync,将文件名(由{}令牌表示)作为命令行参数传递。
如果在所讨论的目录下有符号链接、设备文件等,则可以尝试反转逻辑:
find . -not -type f -exec 'rsync' '{}' ';'这应该“起作用”,就像你所要求的那样(每个文件启动一次rsync )。但我觉得你走错路了。
rsync手册页列出了--timeout (I/O超时)和--contimeout (连接超时),这仅仅是为了迎接timeout。你考虑过用这些吗?
https://unix.stackexchange.com/questions/68775
复制相似问题