我有一个 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 错误。但我如何检查是否是这种情况呢?而且,文件并没有显着增加,导致突然失败。
任何提示将不胜感激。
谢谢。
按照 @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 守护程序设置是否仍然会产生影响?
共识似乎是内存不足是问题所在。所以,我添加了一个新的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. 我现在再次运行它。将返回更新。
添加更多交换并使用--delete-delay而不是--delete-after似乎已经成功了。常规的 cron 作业似乎也运行正常。
另外,我按照这篇文章使 rsync 在发送计算机上使用 sudo 运行。这也消除了Permission denied (13)传输过程中的警告。
谢谢大家的帮助。
PS:参与本次问答的大家都给出了有益的建议。不幸的是,我只能标记一个正确答案。
作为指针,我建议查看服务器端的 rsync 日志。另外,尝试 rysnc 的详细模式:
-v, --verbose 此选项会增加传输过程中提供的信息量。默认情况下,rsync 默默地工作。单个 -v 将为您提供有关正在传输的文件的信息以及最后的简短摘要。两个 -v 选项将为您提供有关跳过哪些文件的信息,并在最后提供更多信息。仅当您正在调试 rsync 时才应使用两个以上的 -v 选项。
| 归档时间: |
|
| 查看次数: |
11817 次 |
| 最近记录: |