我有一个类似守护进程的进程,它启动两个子进程(其中一个子进程启动约 10 个其他子进程)。当我systemctl stop
处理我的进程时,子子进程似乎被“积极地”杀死了systemctl
——这并没有给我的进程一个清理的机会。
我如何才能systemctl stop
退出激进的杀戮,从而让我的进程安排有序的清理?
我试过timeoutSec=30
无济于事。
KillMode=
[1] 默认为control-group
. 这意味着您的服务的每个进程都被 SIGTERM 杀死。
你有两个选择:
TimeoutStopSec
其中关闭(默认为 90 秒 [2])KillMode=mixed
. SIGTERM 将仅发送到主进程。然后再次关机TimeoutStopSec
。如果您没有在 内关闭TimeoutStopSec
,systemd 将发送SIGKILL
到您的所有进程。注意:我建议KillMode=mixed
在选项 2 中使用而不是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=
一个迟到的(可能的)答案,但是当我用谷歌搜索类似的问题数周时,什么也没找到,我想我添加了我的解决方案。
我的错误是我以 root 身份运行 systemd 单元并(使用 sudo)切换到 startscript(继承自 SysVinit 脚本)中的“正确”用户。
这将启动 user.slice 中的进程,该进程在关机时被无情地杀死。当我将单元文件更改为以正确的用户 (USER=myuser) 身份运行并从启动脚本中删除 sudo 时,进程在 system.slice 中启动并在关机时得到正确处理。