rsync通过ssh传输后卡住了

4

我编写了一个bash脚本,用于从Web服务器 (HostGator) 备份文件到运行FreeBSD的本地文件服务器。

我使用rsync通过ssh连接到远程服务器(我已经设置好了预共享的rsa密钥)。当我运行以下行来开始同步时,所有文件似乎都正常传输,但是命令从未返回,脚本永远停滞:

/usr/local/bin/rsync -az --chown=root:admin --chmod=ugo=rwX --exclude ".inode_lock" --rsh='ssh -p2222' admin@domain.com:/home/admin/ '/mnt/blah/blah/LocalBackup/' >> "./Logs/Backup Log.txt"

等待几分钟后,当我使用Ctrl+C停止命令时,会输出以下错误信息:

^CKilled by signal 2.
rsync error: unexplained error (code 255) at rsync.c(636) [generator=3.1.2]
rsync error: received SIGUSR1 (code 19) at main.c(1429) [receiver=3.1.2]

即使双方已经同步并且只是检查更改,仍然会发生这种情况。
我不确定应该如何排除故障。我尝试删除rsync的-v开关,因为一些用户报告说会导致挂起,但我没有看到任何区别。
编辑
还有一个额外的注释。我今天再次运行脚本以继续排除故障。如果我让脚本挂起而不去干扰它,最终我会收到以下消息:
rsync: connection unexpectedly closed (2984632408 bytes received so far) [receiv    er]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [receive    r=3.1.2]
rsync: connection unexpectedly closed (8689703 bytes received so far) [generator    ]
rsync error: unexplained error (code 255) at io.c(226) [generator=3.1.2]

然后返回到命令提示符。我认为这可能是由于远程服务器超时引起的,但我不确定。但我仍然不确定发生卡顿的原因。

更新

我进行了额外的测试,并将 rsync 传输限制为一个特定的测试文件夹,其中包含一些示例文件和子文件夹,而不是获取整个主目录。当我这样做时,它能够成功地完成传输并适当地退出。因此,似乎必须有某个文件或文件夹位于服务器的主目录中,导致问题。是否有任何特定情况下 rsync 无法传输文件?我曾看到它在尝试同步被写锁定的文件时抛出错误,显示“权限被拒绝”,但即使这些文件也没有停止它继续执行。有什么想法吗?

作为补充说明,我连接到的远程服务器位于共享托管帐户上,因此我没有根访问权限。我不知道这可能会导致一些问题?

更新 2

因此,我研究了 rsync 命令并添加了几个命令行参数--progress 和 --stats(连同 --verbose),以便更好地了解其死机位置。现在我注意到的是,当运行命令时,它卡住的地方是正在从服务器下载的一个非常大的文件。但现在通过 --progress 报告(我目前将其直接输出到终端而不是文件),它似乎正常进行,目前没有任何卡顿。

现在我开始怀疑可能由于不活动导致 ssh 连接超时了?特别是因为在最初的情况下,在进行大文件传输时,函数长时间没有输出任何内容。这是可能的情况吗?如果是这样,我该如何保持连接开放?(我不确定将 --progress 更新直接打印到日志文件中是否是个好主意)。


如果您按下Ctrl-D而不是Ctrl-C会发生什么? - Dennis Williamson
我刚试了一下,但没有效果(脚本仍然挂起)。 - Jason O
如果文件增长/更改速度比rsync的速度快,或者存在无法访问或不可靠的嵌套挂载(我特别指的是NFS),这两种情况都可能导致此问题。根据您测试限制了哪些文件进行rsync,这会想起此问题。您可以通过strace进程来查看是否有数据传输,即使在这个过程中似乎已经卡住了也可以。 - Dennis Williamson
这是一个有趣的可能性。但从我现在看到的情况来看,似乎这可能是一个超时问题(不确定)。我不熟悉strace命令,你有什么建议可以用该命令的哪些参数进行故障排除吗? - Jason O
1
在另一个终端中,使用 ps 命令查找您的 rsync 进程的 PID,然后使用类似于 strace -vvvf -s 4096 -p PID 的命令(替换数字)。您应该会看到大量输出。如果 rsync 正在传输数据,则应该在 read()write() 调用中看到表示该数据的字节。 - Dennis Williamson
1个回答

2

好的,我解决了。显然,HostGator的共享服务器默认设置了30-45分钟的SSH超时限制。由于运行rsync所需的时间超过了该限制,因此它会关闭连接。我打电话并与他们的技术支持人员交谈,他们为我的服务器增加了这个限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接