3 回答
TA贡献1725条经验 获得超7个赞
解决方法是添加
KillMode=process
到服务区。默认值是control-group
这意味着 systemd 清理任何子进程。
KillMode= 指定如何终止该单元的进程。控制组、过程、混合、无之一。
如果设置为 control-group,则在 unit stop 时将杀死本单元 control group 中的所有剩余进程(对于服务:执行 stop 命令后,如 ExecStop= 配置的那样)。如果设置为 process,则只会杀死主进程本身。如果设置为混合,则 SIGTERM 信号(见下文)被发送到主进程,而随后的 SIGKILL 信号(见下文)被发送到单元控制组的所有剩余进程。如果设置为 none,则不会杀死任何进程。在这种情况下,单元停止时只会执行停止命令,否则不会杀死任何进程。停止后还活着的进程留在他们的控制组中,控制组在停止后继续存在,除非它是空的。
TA贡献2019条经验 获得超9个赞
如果KillMode由于某种原因你不能(像我一样)改变服务的,你可以试试这个at命令(见man)。
您可以安排您的命令提前 1 分钟运行。看一个例子:
# this will remove all .tmp files from "/path/" in 1 minute ahead (this task will run once)
echo rm /path/*.tmp | at now + 1 minute
TA贡献1784条经验 获得超8个赞
据我所知,解决这个问题的唯一可行方法是使用不同的 cgroup 启动子进程。您可以使用 systemd-run 命令和 --slice 参数来做到这一点。
systemd-run --user --scope --slice=app-firefox firefox
更改 KillMode 还意味着如果您的主进程崩溃,并且任何子进程仍在运行,systemd 将不会重新启动它。
- 3 回答
- 0 关注
- 146 浏览
添加回答
举报