【发布时间】:2019-12-30 20:28:46
【问题描述】:
我编写了一个 bash 脚本,将文件从网络服务器 (HostGator) 备份到运行 FreeBSD 的本地文件服务器。
我使用 rsync over 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 无法传输文件的特定情况?我看到它在尝试同步写锁定的文件时抛出错误,出现“权限被拒绝”错误,但即使这些文件也没有阻止它继续。有什么想法吗?
另外说明,我要连接的远程服务器位于共享主机帐户上,因此我没有 root 访问权限。不知道会不会有什么问题?
更新 2
所以我研究了 rsync 命令并添加了更多命令行参数 --progress 和 --stats(以及 --verbose),这样我可以更好地了解它在哪里死掉了。我现在注意到的是,在运行命令时,它挂在一个从服务器下载的 verrry 大文件上。但是现在报告了 --progress(我现在将它直接输出到终端而不是文件),它似乎进展得很好,到目前为止没有挂断。
我现在开始怀疑可能是 ssh 连接超时或由于不活动而导致的?特别是因为在原始情况下,当大文件传输发生时,函数很长时间没有任何输出。这是可能的情况吗?如果是这样,我该怎么做才能保持连接打开? (我不确定将 --progress 更新直接打印到日志文件是否是个好主意)。
【问题讨论】:
-
如果按 Ctrl-D 而不是 Ctrl-C 会发生什么?
-
我刚试了,没效果(脚本还是挂着)
-
如果文件的增长/更改速度超过了 rsync 的速度,或者如果存在无法访问或不可靠的嵌套挂载(我特别想到 NFS),则其中任何一个都可能导致此问题。这是根据您的测试限制您同步的内容而想到的。您可以跟踪该进程以查看它是否正在传递数据,而它似乎已挂起。
-
这是一个有趣的可能性。但从我现在看到的情况来看,*似乎*这可能是一个超时问题(虽然不确定)。我对 strace 命令不熟悉,您对我可以使用该命令进行故障排除的参数有什么建议吗?
-
在另一个终端中,使用
ps找出你的rsync进程的PID,然后使用strace -vvvf -s 4096 -p PID之类的命令(替换数字)。你应该看到很多输出。如果rsync正在传输数据,您应该会在read()和write()调用中看到表示该数据的字节。
标签: bash ssh webserver backup rsync