我有一个rsync备份脚本来在两个Ubuntu服务器(位于不同的国家)之间传输数据。 正在备份的数据在文件数量方面相当大。 总共大约17GB。 脚本在接收器服务器上运行。 所以,这基本上是一个拉 。 用于login的公私钥authentication。
脚本工作正常; 备份已经成功了好几个月了。
最近6天左右,备份还没有完成。 rsync进程运行大约45分钟左右。 然后就结束了。 我不知道为什么会停下来。 从我所看到的,它甚至不完成构build和扫描文件列表。 我有cron输出指向一个日志文件。 在日志中,我看到的只是: receiving file list ... done 。 但是我可以看到没有任何东西被转移到备份目的地。
如果我手动运行脚本,约45分钟后,我只看到这个: ./sync.sh: line 51: 9078 Killed $RSYNC $OPTIONS $SOURCE $DESTINATION
我如何以及在哪里看到失败的原因? 我怎么知道哪个服务器实际上正在终止进程,发送者或接收者?
拉机(脚本运行的地方)是一个低端机器。 这是一个256MB RAM的KVM虚拟机。 所以,我想知道如果build立文件结构是占用太多的RAM,从而导致OOM错误。 但是,如何检查是否属于这种情况呢? 此外,文件没有显着增加,导致突然失败。
任何提示将不胜感激。
谢谢。
正如@APZ所build议的,我添加了一些更详细的标志(共3个),并手动运行脚本,将输出redirect到一个文件。 这是最后的输出:
(.... 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]
为了回答@TimHaegele,就我所知,VM主机(Prometeus / IperWeb)不会对CPU,IO等进行任何限制。 不过,我可以问他们。 他们是非常高的评价。
我在虚拟机上的Ubuntu安assembly置了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
基于这个证据,如何改变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]
正如你所看到的,发件人机器有3.0.7,接收器(拉手)有3.0.9。 我不太明白错误是什么。
同时,我看到@ APZ的评论,我修改了我的脚本,用--delete-delayreplace--delete-after 。 我现在正在运行它。 将回来更新。
添加更多的交换和使用 – --delete-delay而不是 – --delete-after似乎已经完成了。 正常的cron工作似乎也正常运行。
另外,我也跟着这篇文章 ,让rsync在发送机器上运行sudo。 这也删除了在转移过程中Permission denied (13)的Permission denied (13)警告。
感谢大家的帮助。
PS:参与这个问答的每个人都给出了有用的build议。 不幸的是,我只能标记一个正确的答案。
作为指针,我build议在服务器端查找rsync日志。 另外,请尝试rysnc的详细模式:
-v,–verbose该选项增加了传输过程中提供的信息量。 默认情况下,rsync默默工作。 一个单一的-v将给你关于什么文件正在传输的信息和最后的简要总结。 两个-v选项会给你提供什么文件被跳过的信息,以及最后的信息。 如果您正在debuggingrsync,则只能使用两个以上的-v选项。
运行rsync脚本的KVM虚拟机是由Hoster控制的,它限制IO,CPU时间等资源。
试着回答你的问题我build议:
在256MB以上的主机上运行sync.sh,并由您自己控制,看看它是否成功运行。 如果是的话,你的问题的来源是客户端。
Seconde,有点模糊,但值得在不同的时间进行testing。
除了缩短超时 :
使用更积极的断开连接在服务器上的/ etc / ssh / sshd_config中设置 ,如下所示:
ClientAliveInterval 5 ClientAliveCountMax 3