11

我有一个类似守护进程的进程,它启动两个子进程(其中一个子进程启动约 10 个其他子进程)。当我systemctl stop处理我的进程时,子子进程似乎被“积极地”杀死了systemctl——这并没有给我的进程一个清理的机会。

我如何才能systemctl stop退出激进的杀戮,从而让我的进程安排有序的清理?

我试过timeoutSec=30无济于事。

4

2 回答 2

12

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

你有两个选择:

  • 在每个进程中处理 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=

于 2016-12-05T10:02:05.950 回答
2

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

于 2019-10-21T10:26:39.347 回答