简洁版本:如何让 systemd 控制的服务触发立即关闭?
我有一个守护进程,可以通过以(fork/exec'd)结尾的 shell 脚本执行任意操作来响应某些事件
exec halt -p
或者更具体地说,exec $@
,但在本例中$@
是halt -p
。我也尝试过:
shutdown now
systemctl halt
。
虽然这有效,但似乎存在一个问题,导致关机(通常只需要几秒钟)变成需要几分钟。我怀疑这是因为 systemd 正在等待服务的子进程(本身halt
),而该服务不会根据请求礼貌地终止。也就是说,这有点像一条蛇追逐自己的尾巴的场景。
该服务没有ExecStop
并且是Type=forking
。
答案1
其中man systemd.kill
对该选项的解释如下KillMode
:
KillMode=
指定如何终止该单元的进程。之一对照组、过程、混合、无。
如果设置为控制组,该单元控制组中的所有剩余进程将在单元停止时被终止(对于服务:执行停止命令后,如配置
ExecStop=
)。
ExecStop
这意味着单独定制不会有帮助,但是:
如果设置为过程,只有主进程本身被杀死。
如果设置为没有任何,没有进程被杀死。在这种情况下,机组停止时仅执行停止命令,
因此,ExecStop
可以与 结合使用KillMode=none
。如果守护进程启动持久进程,则这是必要的,以它们而不是halt
.就我而言,它没有,并且守护进程本身有一个SIGTERM
处理程序并且不等待子进程,因此不需要特殊的清理。因此添加到块KillMode=process
中[Service]
解决了问题;守护进程被停止,留下来halt
完成,系统将像平常一样在几秒钟内关闭。