微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 如何在systemd控制组之外启动进程

我有一个服务器进程(从systemd启动),可以启动更新过程.更新过程自我守护自身然后(理论上)用SIGTERM杀死服务器.我的问题是SIGTERM传播到更新过程,它是孩子们.

出于调试目的,更新过程只是休眠,我手动发送kill.

kill之前的PS输出示例:

    1  1869  1869  1869 ?           -1 Ss       0   0:00 /usr/local/bin/state_controller --start
 1869  1873  1869  1869 ?           -1 Sl       0   0:00  \_ ProcessWebController --start
 1869  1886  1869  1869 ?           -1 Z        0   0:00  \_ [UpdateSystem] <defunct>
    1  1900  1900  1900 ?           -1 Ss       0   0:00 /bin/bash /usr/local/bin/UpdateSystem refork /var/ttm/update.bin
 1900  1905  1900  1900 ?           -1 S        0   0:00  \_ sleep 10000

请注意,UpdateSystem位于单独的PGID和TPGID中. (< defunct>进程是守护进程的结果,并且(我认为)不是问题.)

UpdateSystem一个bash脚本(虽然我可以很容易地使它成为一个C程序,如果这将有所帮助).从https://stackoverflow.com/a/29107686/771073获取守护程序代码后,有趣的是:

#############################################
trap "echo Ignoring SIGTERM" SIGTERM
sleep 10000
echo Awoken from sleep - presumably by the SIGTERM
exit 0

当我杀死1869(它将SIGTERM发送到state_controller服务器进程时,我的日志文件包含:

Terminating
Ignoring SIGTERM
Awoken from sleep - presumably by the SIGTERM

我真的想阻止SIGTERM被发送到睡眠过程.

(实际上,我真的想阻止它被发送到apt-get升级,这是通过系统停止ttm.service的道德等效来停止系统,并且ExecStop指定为/ bin / kill $MAINPID – 以防万一改变任何人的回答.)

这个问题是类似的,但是接受的答案(使用KillMode = process)对我来说效果不好 – 我想杀死一些子进程,而不是更新进程:
Can’t detach child process when main process is started from systemd

解决方法:

一种完全不同的方法升级过程通过更新/ sys / fs / cgroup / systemd文件系统将其自身从服务组中删除.特别是在bash中:

echo $$> /sys/fs/cgroup/systemd/tasks

进程只属于一个控制组.将其PID写入根任务文件会将其添加到其他控制组,并将其从服务控制组中删除.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐