Я использую пользовательские таймеры systemd в качестве замены cron. У меня определенная программа настроена на выполнение каждые 20 минут. Программа не является демоном, зависит от сети и запускает ряд дочерних процессов. Однако я заметил, что таймер часто останавливается через несколько часов (или дней). Таймер по-прежнему активен, но программа больше не выполняется каждые 20 минут. pgrep
показывает количество все еще активных процессов. Наблюдая за этим, я добавил JobTimeoutSec=3m
в файл .service, ожидая, что процессы будут убиты, если они истекут.
systemctl status --user PROGRAM.service
теперь выводит следующее, однако дочерние процессы все еще работают, и таймер больше не выполняет программу каждые 20 минут:
13 февраля 15:03:45 HOSTNAME systemd [1878]: истекло время ожидания задания PROGRAM.service / start.
13 февраля 15:03:45 HOSTNAME systemd [1878]: истекло время, начиная с ОПИСАНИЯ.
13 февраля 15:03:45 HOSTNAME systemd [1878]: Задание PROGRAM.service / start завершилось неудачно с результатом «тайм-аут».
Я предполагаю, что дочерние процессы программы останавливаются из-за сетевых проблем, и systemd не может их убить по истечении времени ожидания.
Любые предложения по решению этой проблемы, чтобы таймер продолжал работать должным образом?
Замена ExecStart=/path/to/program
на ExecStart=/usr/bin/timeout 20m /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
выводит следующее:
systemd 219
+ PAM + AUDIT + SELINUX + IMA + APPARMOR + SMACK + SYSVINIT + UTMP + LIBCRYPTSETUP + GCRYPT -GNUTLS + ACL + XZ -LZ4 -SECCOMP + BLKID -ELFUTILS + KMOD -IDN