我需要将目录同步到远程服务器上的目录。目前我经常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]
答案1
看起来服务器在 SSH 连接级别超时。
所以我添加了这些设置:
KeepAlive yes
ServerAliveInterval 20
ServerAliveCountMax 6
到/etc/ssh/ssh_config
(或~/.ssh/config
) 现在看起来很有希望。
答案2
更新:由于 rsync 创建校验和时似乎会发生超时,因此这里有一些可能有效的不同方法。
首先,要仅保持一个 rsync 打开,您可以(除了 Michael Kjö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 Kjörling 提到的 --timeout 和 --contimeout 选项也可能有用。
答案3
也许是这样的?
find . -type f -exec 'rsync' '{}' ';'
这将为当前目录下的每个常规文件执行一次 rsync,并将文件名(由令牌表示{}
)作为命令行参数传递。
如果相关目录下有符号链接、设备文件等,您可以尝试反转逻辑:
find . -not -type f -exec 'rsync' '{}' ';'
从执行您所要求的操作(每个文件启动 rsync 一次)的意义上来说,这应该“有效”。但我感觉你的处理方式是错误的。
rsync 手册页列出了--timeout
(I/O 超时)和--contimeout
(连接超时),这只是来自 grep for timeout
.您考虑过使用这些吗?
答案4
对我来说,在连接速度较慢的情况下恢复大型 rsync 传输时,这种情况不断发生。我什至使用 rsyncd 来避免 ssh 的所有问题。
我发现启用压缩(-z
或--compress
)解决了这个问题。传输几乎立即恢复。