TL;DR:我正在尝试构建一种机制来推迟任何请求的重新启动,直到特定的敏感进程完成其工作。
在 systemd 中,reboot.target
有一个默认的JobTimeoutSec=30min
, 和JobTimeoutAction=force-reboot
。
我有一项任务需要ExecStop
能够不间断地完成。因此,该服务有一个TimeoutStopSec=infinity
;但是,如果此停止操作阻塞了 的调度reboot.target
,则即使停止操作仍在运行, JobTimeout
onreboot.target
最终也会导致强制重新启动。
我当前解决此问题的尝试是构建一个覆盖层,reboot.target
将默认值替换JobTimeoutAction=force-reboot
为JobTimeoutAction=exit
, 并添加一个OnFailure
事件;像下面这样:
# /etc/systemd/system/reboot.target.d/defer-if-critical-job-running.conf
[Unit]
JobTimeoutAction=exit
FailureActionExitStatus=1
OnFailure=reboot-now-unless-critical-job-is-running.service
# /etc/systemd/system/reboot-now-unless-critical-job-is-running.service
[Unit]
Description=Reboot unless a critical job is running
DefaultDependencies=no
[Service]
ExecStart=/bin/sh -c 'if systemctl is-active some-critical-job.service; then systemctl reboot; else systemctl reboot --force; fi'
然而,这实际上不起作用:当到达JobTimeout
on时,我们仍然立即强制重新启动。reboot.target
我怎样才能无限期推迟重新启动,但是仅有的当特定的关键作业正在运行时?