运行CentOS7.4,rsync v3.1.2
我有一个 python 脚本(v3.6),它使用 rsync 轮询远程文件服务器位置。 Rsync 确保远程位置上的放置文件夹与本地计算机上的文件夹相同。我需要这些文件夹相同,rsync 似乎可以胜任这项任务。
但是,只要文件超过 40 个,rsync 就会出现错误并显示以下输出:rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(638) [sender=3.1.2]
和rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at io.c(504) [generator=3.1.2]
。这些文件几乎总是一系列 jpeg 图像和单个 xml 文件。
我已经在终端 shell 中运行了确切的 rsync 命令,没有出现任何问题。看来因为我已经守护了我的脚本并将其留给 systemd 来处理程序,所以它不喜欢 rsync 复制那么多文件。我不确定原因。我的印象是内核的 OOM 杀手是罪魁祸首,因为 rsync 正在接收 SIGINT、SIGTERM 或 SIGHUP(如错误中所述),但我跑去journalctl -k
发现任何 OOM 杀手,但没有出现与 rsync 相关的。
我的工作站有 64 GB 的内存可供使用,但并不经常使用几乎所有的空间,所以我很困惑是什么导致 rsync 这样做。如果需要更多信息,请随时询问,因为我需要在本周末之前找到解决方案。
rsync命令:rsync -a -vv -Ph --temp-dir=/tmp /inbox/loc/ /outbox/loc
Python 调用:retval = subprocess.check_call(['rsync','-a', '-vv', '-Ph', '--temp-dir=/tmp', inbox, outbox])
系统单元文件:
[Unit]
Description = CAR daemon
[Service]
Type = simple
PIDFile = /var/run/card/card.pid
ExecStart = /usr/bin/python3.6 /scratch/ssd/jamal/dev/github/CAR_WF/card/main.py
[Install]
WantedBy = multi-user.target
其中一次运行的 Journalctl 示例输出(针对敏感数据进行了编辑):
Dec 18 08:59:13 hostname systemd[1]: Started CAR daemon.
Dec 18 08:59:13 hostname systemd[1]: Starting CAR daemon...
Dec 18 08:59:14 hostname python3.6[2928]: sending incremental file list
Dec 18 08:59:14 hostname python3.6[2928]: delta-transmission disabled for local transfer or --whole-file
Dec 18 08:59:14 hostname python3.6[2928]: ./
Dec 18 08:59:14 hostname python3.6[2928]: FOR VFX DOCUMENT/
Dec 18 08:59:14 hostname python3.6[2928]: FOR VFX DOCUMENT/0000 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [102B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0001 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [102B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0002 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [102B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0003 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [102B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0004 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [102B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0005 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [102B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0006 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [102B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0007 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [102B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0008 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [102B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0009 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [103B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0010 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [103B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0011 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: [103B blob data]
Dec 18 08:59:15 hostname python3.6[2928]: FOR VFX DOCUMENT/0012 file.jpg
Dec 18 08:59:15 hostname python3.6[2928]: rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(638) [sender=3.1.2]
Dec 18 08:59:15 hostname python3.6[2928]: rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at io.c(504) [generator=3.1.2]
输出ulimit -a
:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256628
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 256628
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
我应该补充一下,rsync 的调用方式如下:
- Systemd 生成 python 进程。
subprocess.Popen()
Python 脚本在初始化时使用以下参数生成轮询过程:['python3.6', '/path/to/poller.py', '/inbox/dir/', '/outbox/dir']
- 当轮询器计时器为零时,它会调用 rsync 来检查更改。
我希望这能澄清 rsync 进程是从哪里调用的。
答案1
对我来说,rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(638)
通过将运行 rsync 的用户的 ssh 密钥复制到目标服务器来解决。为此我跑了:
ssh-copy-id [user]@[host-name]
如果您没有生成密钥或将主机添加到known_hosts,请首先运行以下命令:
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-keyscan -H [host-name] >> ~/.ssh/known_hosts
它位于 Oracle Linux 7,rsync 版本 3.1.2 上