systemd`systemctl stop`积极地杀死子进程

时间:2016-11-30 20:58:15

标签: redhat systemd systemctl

我有一个类似守护进程的进程,它启动两个子进程(其中一个子进程启动~10个其他子进程)。当我systemctl stop我的过程时,孩子子流程看起来似乎是积极的'被systemctl杀死 - 这并没有让我的进程有机会清理。

如何让systemctl stop退出激进的杀戮,从而让我的进程协调有序清理?

我试过timeoutSec=30无济于事。

2 个答案:

答案 0 :(得分:4)

KillMode= [1]默认为control-group。这意味着您的服务的每个进程都会被SIGTERM杀死。

您有两种选择:

  • 处理每个进程中的SIGTERM并在TimeoutStopSec内关闭(默认为90秒[2])
  • 如果您确实想要从主进程委派关闭,请设置KillMode=mixed。 SIGTERM将仅发送到主进程。然后在TimeoutStopSec内再次关闭。如果您未在TimeoutStopSec内关闭,systemd会向您的所有流程发送SIGKILL

注意:我建议在选项2中使用KillMode=mixed而不是KillMode=process,因为后者只会将最终SIGKILL发送到您的主流程,这意味着您的子流程会如果他们被锁起来就不会被杀死。

[1] https://www.freedesktop.org/software/systemd/man/systemd.kill.html#KillMode=

[2] https://www.freedesktop.org/software/systemd/man/systemd-system.conf.html#DefaultTimeoutStartSec=

答案 1 :(得分:2)

一个较晚的(可能的)答案,但是当我用类似的问题在谷歌上搜索了数周,却一无所获时,我想出了自己的解决方案。
我的错误是我以root用户身份运行systemd单元并切换(使用sudo)开始脚本(从SysVinit脚本继承)中的“正确”用户。
这将启动user.slice中的进程,该进程在关机时会被无情地杀死。当我更改单位文件以正确的用户身份(USER = myuser)运行并从启动脚本中删除sudo时,进程将在system.slice中启动,并在关闭时得到正确处理。

相关问题