如果 systemd 服务运行时间太长,如何重新启动?

如果 systemd 服务运行时间太长,如何重新启动?

我有一项服务每周运行一次缓慢且有缺陷的一次性程序,该程序有时可能会无明显原因挂起。如果该服务运行时间超过 4 小时,我希望重新启动该服务。我尝试将其设置为在 4 小时后重新启动(如果它仍在使用以下单元定义运行):

[Unit]
Description=Some buggy software

[Service]
WorkingDirectory=/home/buggy
ExecStart=/home/buggy/run
Environment=NODE_VERSION=14
Restart=on-failure
RestartSec=4 h
StartLimitBurst=4
StartLimitInterval=1 s

还有一个计时器:

[Unit]
Description=Some buggy software schedule timer

[Timer]
Unit=buggy.service
OnCalendar=Sat *-*-* 22:00:00

[Install]
WantedBy=timers.target

但它仍然可以无限期地挂起,我在运行两天后查看我的服务,但它仍然挂起。

我做错了什么?有没有办法用 systemd 来做我需要的事情?

答案1

使用 RuntimeMaxSec 指令。您不能使用看门狗,因为需要修改有缺陷的程序。

man systemd.service:

RuntimeMaxSec=

配置服务运行的最长时间。如果使用此功能并且服务的活动时间超过指定时间,则该服务将终止并进入故障状态。请注意,此设置对服务没有任何影响Type=oneshot,因为它们在激活完成后立即终止。通过infinity(默认)以配置无运行时间限制。

Type=notify如果/的服务Type=notify-reload发送EXTEND_TIMEOUT_USEC=...,这可能会导致运行时间延长RuntimeMaxSec=。第一次收到此消息必须发生在RuntimeMaxSec=超过之前,并且一旦运行时间超出了RuntimeMaxSec=,服务管理器将允许服务继续运行,前提是服务在指定的时间间隔内重复,直到通过(或终止)EXTEND_TIMEOUT_USEC=...实现服务关闭STOPPING=1)。 (看 sd_notify(3))。

相关内容