通过 systemd 服务停止

通过 systemd 服务停止

简洁版本:如何让 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完成,系统将像平常一样在几秒钟内关闭。

相关内容