我有一个类似守护进程的进程,它启动两个子进程(其中一个子进程启动~10个其他子进程)。当我systemctl stop
我的过程时,孩子子流程看起来似乎是积极的'被systemctl
杀死 - 这并没有让我的进程有机会清理。
如何让systemctl stop
退出激进的杀戮,从而让我的进程协调有序清理?
我试过timeoutSec=30
无济于事。
答案 0 :(得分:4)
KillMode=
[1]默认为control-group
。这意味着您的服务的每个进程都会被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中启动,并在关闭时得到正确处理。