bash - 通过 ssh 传输后 rsync 挂起

标签 bash ssh webserver backup rsync

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

我使用 rsync over ssh(从文件服务器)连接到远程服务器(我已经设置了预共享 rsa key )。当我运行以下行开始同步时,所有文件似乎都正常运行,但命令永远不会返回并且脚本永远挂起:

/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 更新直接打印到日志文件是个好主意)。

最佳答案

好的,我明白了。显然 HostGator 的共享服务器默认设置了 30-45 分钟的 SSH 超时限制。由于运行 rsync 花费的时间超过了该限制,因此它正在关闭连接。我调用他们的技术支持并与他们交谈,他们为我的服务器增加了支持。

关于bash - 通过 ssh 传输后 rsync 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57661435/

相关文章:

bash - 在脚本中通过 ssh 使用反引号 (`)

bash - 使用 grep 或 sed 即时复制和修改复杂的行

bash - 尝试从 bash 中的字符串中检索前 5 个字符(仅数字和字母)

Linux Shell脚本执行而不保存到临时变量

c# - 有没有一种方法可以在 c# 中编程,这样当一个 exe 运行时,它服务并处理本地主机上的请求

java - 哪些 Java 框架的运行方式与 PHP 类似?

html - 是否可以获取网站目录下的文件列表?如何?

php - 如何通过终端获取 PHP 的 tar.gz 文件?

linux - 只要子进程仍在运行,就在父进程中每 90 秒在 perl 中记录一次消息

ssh - 如何获取 pem 文件的公钥?