我有一个服务器进程(从 systemd 启动),可以启动更新进程。更新过程自行守护进程,然后(理论上)使用 SIGTERM 终止服务器。我的问题是 SIGTERM 传播到更新过程这是孩子们.
出于调试目的,更新进程只是休眠,然后我手动发送终止命令。
杀死前的 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 https://stackoverflow.com/a/29107686/771073,有趣的是:
#############################################
trap "echo Ignoring SIGTERM" SIGTERM
sleep 10000
echo Awoken from sleep - presumably by the SIGTERM
exit 0
When I kill 1869
(它将 SIGTERM 发送到state_controller
服务器进程,我的日志文件包含:
Terminating
Ignoring SIGTERM
Awoken from sleep - presumably by the SIGTERM
我真的想阻止 SIGTERM 被发送到sleep
过程。
(其实我really想要阻止它被发送到apt-get upgrade
这是通过道德等价物来停止系统systemctl stop ttm.service
和ExecStop
指定为/bin/kill $MAINPID
- 以防万一改变任何人的答案。)
这个问题是类似的,但接受的答案(使用KillMode=process
)对我来说效果不好 - 我想杀死一些子进程,而不是更新进程:从 systemd 启动主进程时无法分离子进程 https://stackoverflow.com/questions/32208782/cant-detach-child-process-when-main-process-is-started-from-systemd