我有一项服务每周运行一次缓慢且有缺陷的一次性程序,该程序有时可能会无明显原因挂起。如果该服务运行时间超过 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 指令。您不能使用看门狗,因为需要修改有缺陷的程序。
RuntimeMaxSec=
配置服务运行的最长时间。如果使用此功能并且服务的活动时间超过指定时间,则该服务将终止并进入故障状态。请注意,此设置对服务没有任何影响
Type=oneshot
,因为它们在激活完成后立即终止。通过infinity
(默认)以配置无运行时间限制。
Type=notify
如果/的服务Type=notify-reload
发送EXTEND_TIMEOUT_USEC=...
,这可能会导致运行时间延长RuntimeMaxSec=
。第一次收到此消息必须发生在RuntimeMaxSec=
超过之前,并且一旦运行时间超出了RuntimeMaxSec=
,服务管理器将允许服务继续运行,前提是服务在指定的时间间隔内重复,直到通过(或终止)EXTEND_TIMEOUT_USEC=...
实现服务关闭STOPPING=1
)。 (看sd_notify(3)
)。