在 systemd 下运行时 rsync 错误代码 20

在 systemd 下运行时 rsync 错误代码 20

运行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 的调用方式如下:

  1. Systemd 生成 python 进程。
  2. subprocess.Popen()Python 脚本在初始化时使用以下参数生成轮询过程:['python3.6', '/path/to/poller.py', '/inbox/dir/', '/outbox/dir']
  3. 当轮询器计时器为零时,它会调用 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 上

相关内容