【发布时间】:2016-05-25 01:31:07
【问题描述】:
我使用 systemd 用户计时器作为 cron 替代品。我有一个特定的程序设置为每 20 分钟执行一次。该程序不是守护进程,它依赖于网络,并启动了许多子进程。然而,我注意到计时器经常在几个小时(或几天)后停止。计时器仍处于活动状态,但程序不再每 20 分钟执行一次。 pgrep 显示许多进程仍处于活动状态。观察到这一点后,我在 .service 文件中添加了JobTimeoutSec=3m,希望进程超时会被杀死。
systemctl status --user PROGRAM.service 现在输出以下内容,但是子进程仍在运行,计时器不再每 20 分钟执行一次程序:
2 月 13 日 15:03:45 HOSTNAME systemd[1878]:作业 PROGRAM.service/start 超时。
2 月 13 日 15:03:45 HOSTNAME systemd[1878]:启动说明超时。
2 月 13 日 15:03:45 HOSTNAME systemd[1878]:作业 PROGRAM.service/start 失败,结果为“超时”。
我猜该程序的子进程由于网络问题而停止,并且 systemd 在超时时无法杀死它们。
有任何解决此问题的建议,以便计时器按预期继续运行吗?
用ExecStart=/usr/bin/timeout 20m /path/to/program 替换ExecStart=/path/to/program 似乎可以解决这个问题,但我想知道为什么单独使用systemd 不能解决这个问题。
调试信息
PROGRAM.service
[Unit]
Description=DESCRIPTION
After=network.target
PartOf=network-online.target
JobTimeoutSec=3m
[Service]
Type=oneshot
ExecStart=/path/to/program
[Install]
WantedBy=network-online.target
PROGRAM.timer
[Unit]
Description=Run PROGRAM.service every 20 minutes
[Timer]
OnCalendar=*:0/20
[Install]
WantedBy=timers.target
systemd --version 输出以下内容:
系统 219
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN
【问题讨论】:
-
我建议将问题迁移到unix.stackexchange.com