通过 SSH 备份期间 Rsync 进程突然终止

Anj*_*jan 5 ubuntu ssh rsync

我有一个 rsync 备份脚本来在两个 Ubuntu 服务器(位于不同国家)之间传输数据。就文件数量而言,正在备份的数据相当大。总共大小约为17GB。该脚本在接收服务器上运行。所以,它基本上是一个拉力。用于登录的公私密钥身份验证。

该脚本运行良好;备份已经成功进行了好几个月了。

最近已经过去6天左右了,备份一直没有完成。rsync 进程运行大约 45 分钟左右。然后就结束了。我不知道为什么它停止了。据我所见,它甚至没有完成构建和扫描文件列表。我将 cron 输出定向到日志文件。在日志中,我看到的只是:receiving file list ... done。但我可以看到没有任何内容被传输到备份目的地。

如果我手动运行脚本,大约 45 分钟后,我只会看到以下内容:./sync.sh: line 51: 9078 Killed $RSYNC $OPTIONS $SOURCE $DESTINATION

我如何以及在哪里可以看到失败的原因?我如何知道哪个服务器实际上正在终止进程,发送者还是接收者?

(脚本运行的地方)是一个低端机器。它是一个具有 256MB RAM 的 KVM 虚拟机。所以,我想知道文件结构的构建是否占用了太多 RAM,从而导致 OOM 错误。但我如何检查是否是这种情况呢?而且,文件并没有显着增加,导致突然失败。

任何提示将不胜感激。

谢谢。

更新1

按照 @APZ 的建议,我添加了几个更详细的标志(总共 3 个)并手动运行脚本,将输出重定向到文件。这是最后的输出:

(.... lots of file names....)
received 5795917 names
done
recv_file_list done
get_local_name count=5795917 /storage/  <======== Reached here after about 40 minutes. Was stuck here for about 10 minutes or so.
[Receiver] _exit_cleanup(code=14, file=main.c, line=788): about to call exit(14)

rsync: fork failed in do_recv: Cannot allocate memory (12)
rsync error: error in IPC code (code 14) at main.c(788) [Receiver=3.0.9]
Run Code Online (Sandbox Code Playgroud)

回答@TimHaegele,据我所知,VM 主机(Prometeus / IperWeb)不会对 CPU、IO 或任何东西进行任何限制。不过我可以问他们。他们的评价非常高。

我在 VM 上安装的 Ubuntu 配置了 512 MB 交换空间。也许我可以增加到 2 GB 左右?磁盘空间不是问题。

当 rsync 运行时,这是以下输出free -m

             total       used       free     shared    buffers     cached
Mem:           239        236          2          0          0          3
-/+ buffers/cache:        232          7
Swap:          511        510          1
Run Code Online (Sandbox Code Playgroud)

根据这些证据,按照建议更改 SSH 守护程序设置是否仍然会产生影响?

更新2

共识似乎是内存不足是问题所在。所以,我添加了一个新的2GB交换文件并激活它。所以,现在我总共有 2.5 GB 的交换空间。

然后,我再次运行脚本(手动)。这次,跑了90多分钟。此时它正在传输文件。但突然间,该过程退出了。在日志中,我看到它因以下错误而终止:

Invalid packet at end of run (4330026) [sender]
[generator] _exit_cleanup(code=12, file=io.c, line=1532): about to call exit(12)
rsync error: protocol incompatibility (code 2) at main.c(695) [sender=3.0.7]
rsync: writefd_unbuffered failed to write 23 bytes to socket [generator]: Broken pipe (32)
rsync error: error in rsync protocol data stream (code 12) at io.c(1532) [generator=3.0.9]
[receiver] _exit_cleanup(code=19, file=main.c, line=1316): about to call exit(19)
rsync error: received SIGUSR1 (code 19) at main.c(1316) [receiver=3.0.9]
Run Code Online (Sandbox Code Playgroud)

如您所见,发送方机器有 3.0.7 ,接收方(拉取器)有 3.0.9 。我不太明白错误是什么。

同时,我看到了 @APZ 的评论,我修改了我的脚本以替换--delete-after--delete-delay. 我现在再次运行它。将返回更新。

更新3

添加更多交换并使用--delete-delay而不是--delete-after似乎已经成功了。常规的 cron 作业似乎也运行正常。

另外,我按照这篇文章使 rsync 在发送计算机上使用 sudo 运行。这也消除了Permission denied (13)传输过程中的警告。

谢谢大家的帮助。

PS:参与本次问答的大家都给出了有益的建议。不幸的是,我只能标记一个正确答案。

APZ*_*APZ 3

作为指针,我建议查看服务器端的 rsync 日志。另外,尝试 rysnc 的详细模式:

-v, --verbose 此选项会增加传输过程中提供的信息量。默认情况下,rsync 默默地工作。单个 -v 将为您提供有关正在传输的文件的信息以及最后的简短摘要。两个 -v 选项将为您提供有关跳过哪些文件的信息,并在最后提供更多信息。仅当您正在调试 rsync 时才应使用两个以上的 -v 选项。

  • 它似乎耗尽了内存。(来自 rsync 文档)通常,当您传输大量文件时,运行 rsync 时会发生内存不足。文件的大小并不重要,重要的是文件的总数。首先尝试使用增量递归模式:将双方升级到 rsync 3.0.0 或更高版本,并避免禁用增量递归的选项(例如,使用 --delete-delay 而不是 --delete-after)。如果这是不可能的,您可以使用 --relative 和/或排除规则将 rsync 运行分解为在各个子目录上运行的较小块。 (2认同)