systemd `systemctl stop` 主动杀死子进程

Posted

技术标签:

【中文标题】systemd `systemctl stop` 主动杀死子进程【英文标题】:systemd `systemctl stop` aggressively kills subprocesses 【发布时间】:2017-04-15 08:23:21 【问题描述】:

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

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

我试过timeoutSec=30 无济于事。

【问题讨论】:

您查看过man systemd.servicesman systemd.kill 中的文档吗? 【参考方案1】:

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=

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于systemd `systemctl stop` 主动杀死子进程的主要内容,如果未能解决你的问题,请参考以下文章

systemctl命令用法

linux常用命令:systemctl 命令

systemd和systemctl详解

Linux命令之管理系统服务systemctl

systemd--systemctl

systemd与systemctl