【发布时间】:2016-05-14 00:26:31
【问题描述】:
我有一个可以启动更新进程的服务器进程(从 systemd 启动)。更新过程自我守护,然后(理论上)使用 SIGTERM 杀死服务器。我的问题是 SIGTERM 传播到更新进程并且它是子进程。
出于调试目的,更新进程只是休眠,然后我手动发送 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
当我kill 1869(将 SIGTERM 发送到state_controller 服务器进程时,我的日志文件包含:
Terminating
Ignoring SIGTERM
Awoken from sleep - presumably by the SIGTERM
我真的想阻止将 SIGTERM 发送到sleep 进程。
(实际上,我真的想阻止它被发送到apt-get upgrade,它通过systemctl stop ttm.service 的道德等价物来停止系统,ExecStop 被指定为/bin/kill $MAINPID - 以防万一这会改变任何人的答案。)
这个问题很相似,但接受的答案(使用KillMode=process)对我来说效果不佳 - 我想杀死一些子进程,而不是更新进程:
Can't detach child process when main process is started from systemd
【问题讨论】: