有条件地延长 systemd 重启超时

有条件地延长 systemd 重启超时

TL;DR:我正在尝试构建一种机制来推迟任何请求的重新启动,直到特定的敏感进程完成其工作。


在 systemd 中,reboot.target有一个默认的JobTimeoutSec=30min, 和JobTimeoutAction=force-reboot

我有一项任务需要ExecStop能够不间断地完成。因此,该服务有一个TimeoutStopSec=infinity;但是,如果此停止操作阻塞了 的调度reboot.target,则即使停止操作仍在运行, JobTimeoutonreboot.target最终也会导致强制重新启动。


我当前解决此问题的尝试是构建一个覆盖层,reboot.target将默认值替换JobTimeoutAction=force-rebootJobTimeoutAction=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'

然而,这实际上不起作用:当到达JobTimeouton时,我们仍然立即强制重新启动。reboot.target

我怎样才能无限期推迟重新启动,但是仅有的当特定的关键作业正在运行时?

相关内容