前言:

  最近服务器在进行数据同步的时候老会自动断开连接,导致视频没有在规定的时间内传完,为了解决这个问题,百度了好多,都没有个好办法,偶尔在官网上看到了这篇文章,并在里边找到了自己服务器的问题,所以翻译过来和大家分享下,原文地址:https://rsync.samba.org/issues.html

1.Q:rsync服务挂起了,我应该怎么办

 A:当遇到服务挂起或假死,在杀死进程前请收集以下信息

   i_f43.gif在netstat两端发送/接收队列的状态显示

   i_f43.gif系统调用是卡在了调用什么进程(可以使用truss solaris,strace等)

solaris truss(http://blog.csdn.net/sunlin5000/article/details/6560736

strace(http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html)

可以参考下例“rsync-debug”是如何从远端rsync进程抓取strace的信息。假如你需要帮助,可以发邮件给我们

2.Q:为什么当我使用LDAP(Lightweight Directory Access Protocol)查看用户和组的时候我的rsync使用进程会崩溃

 A:当从守护进程里边查找一个名字的时候在LDAP libraries里边会有一个bug(不包含库的副本执行查找),这个bug需要LDAP libraries修复,已经超出rsync的能力范围了。你可以通过使用--numeric-ids选项关闭chroot来解决这个问题,或者放弃使用LDAP来查找。

3.Q:为什么我的传输会断开并且报如下的错误

rsync: error writing 4 unbuffered bytes - exiting: Broken pipe
rsync error: error in rsync protocol data stream (code 12) at io.c(463)

或者

rsync: connection unexpectedly closed (24 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(342)

 A:这个错误告诉你本地rsync进程试图和远程rsync通信,但是这个连接已经断开。你必须搞清楚这是为什么,所欲你需要做一些调查

  假如这个远程rsync是守护进程,你第一步应该做的是当连接断开的时候查看下日志文件,看看里边是否有错误原因。当然,在服务端和客户端都检查一遍来确保日志文件设置是正确的,在rsyncd.conf中错误的日志文件设置会引起这个问题。

  从2.6.3版本开始,rsync在检索错误方面做的比老版本都好,所以你可以更新版本来看看从远程rsync发送的错误信息。

这里有几个比较常见的会导致rsync进程失效的原因

  +目标服务器的磁盘空间已满

  +一个空闲的连接导致路由器或远程shell服务器关闭连接

  +网络错误会导致连接断开

  +远程rsync的可执行文件没有找到

  +远程rsync设置不能正常工作或者没有清楚缓存(给rsync发送错误或虚假的信息)

假如你认为这个问题是因为空间连接导致的,你可以使用--timeout选项来解决这个问题(会在服务暂停的时候发送保活信息)。当然也可以在第二版协议中来配置ssh保活时间(可以查看KeepAlive, ServerAliveInterval, ClientAliveInterval, ServerAliveCountMax, 和ClientAliveCountMax)。当然也可以切换--delete到--del来避免空闲或服务暂停。

假如你不能找到故障发生的原因,你可以参考以下步骤来分析。一种方法就是可以在远端服务器使用rsync-debug,格式如下

rsync -av --rsync-path=/some/path/rsync-debug HOST:SOURCE DEST
rsync -av --rsync-path=/some/path/rsync-debug SOURCE HOST:DEST

  这个脚本可以核心转储并且在/tmp目录下生成一个文件用来记录下系统调用导致失败的原因。你可以使用这个文件来帮助你盘查远程rsync失效的原因。

核心转储(http://blog.csdn.net/onlyonename/article/details/8120050

remote-shell:简称rsh(http://blog.csdn.net/zhongyunde/article/details/6955976)

  如果直接使用rsync守护进程(而没有使用rsh),上面的脚本不会起任何作用。换言之,停止当前的守护进程,然后运行一个debug程序允许core-dumps,并且(如果需要的话)使用一个系统调用追踪工具如strace,truss,或者tusc.通过监视调试,你可能会这么做(-f选项告诉strace子进程也要追踪)

ulimit -c unlimited
strace -f -t -s 1024 -o /tmp/rsync-$$.out rsync --daemon --no-detach

  然后你使用一个单独的窗口来重新执行命令,在这之后就可以使杀死rsync进程(ctrl+c)

  如果你正在使用rsync的超级守护进程inetd,我建议你临时关掉它,以上就是怎么守护程序调试来找到rsync失败的原因。

inetd:(http://blog.chinaunix.net/uid-21411227-id-1826876.html)

4.Q:为什么我连接rsync的时候(使用“::”语法)会立马失败并且报如下的错误

rsync: connection unexpectedly closed (24 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(342)

 A:老的rsync版本是不能返回在option-parsing phase of the transfer产生的错误。在服务器的日志文件中查看是否有错误信息,比如refused,或者其它rsync不支持的选项(e.g.  perhaps links are not supported by the server)或者一些其它的错误(such as trying to send data to a read-only module)。更新rsync的版本(至少是2.6.3)会让这些错误信息都能够返回rsync的客户端。

5.Q:那还有其它的一些问题吗?

 A:那是肯定的,你可以找到其中的一些在https://download.samba.org/pub/rsync/TODO或者https://bugzilla.samba.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=RESOLVED&bug_status=VERIFIED&product=rsync