我编写了一个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 更新直接打印到日志文件中是否是个好主意)。
ps
命令查找您的rsync
进程的 PID,然后使用类似于strace -vvvf -s 4096 -p PID
的命令(替换数字)。您应该会看到大量输出。如果rsync
正在传输数据,则应该在read()
和write()
调用中看到表示该数据的字节。 - Dennis Williamson