我有以下一组进程,需要通过第一个列出的进程以编程方式关闭,这是我编写的C程序。
PID PGRP SESN PPID USER TTY CMD
6553 6553 6553 1 root ? ./startserv
6554 6553 6553 6553 root ? expect -- /usr/bin/unbuffer ./srcds_run...
6555 6555 6555 6554 root pts/1 /bin/sh ./srcds_run -autoupdate -game c...
6565 6555 6555 6555 root pts/1 ./srcds_linux -autoupdate -game cstrike...
在这种情况下我通常手工做的就是杀死6553 6555.显然我知道自己的pid,但是编写类似“杀死我的pid + 2”的东西似乎有点傻(虽然看起来这会[几乎总是工作。帮助?
答案 0 :(得分:1)
这些答案都不是非常正确 - 最简单的处理方法是将进程放在进程组中(子进程继承父进程组,因此你的闭源二进制文件也应该很好)通过{{3然后通过getpgrp/setpgrp一次性杀死所有这些,这保证了所有人都能同时接收信号,没有任何竞争条件会让孩子在适当的时间分叉逸出。
答案 1 :(得分:0)
这听起来像是一个全面的糟糕设计。你为什么这样需要它?你的startserv
进程将子进程作为子进程启动是否更有意义,在这种情况下杀死它们很简单?你想要实现什么目标?
答案 2 :(得分:0)
来自kill(2)系统调用的手册页:
如果pid是负但不是-1,则sig被发送到所有进程(一组未指定的系统进程除外),其进程组ID等于pid的绝对值,并且进程有权发送信号
(我在这里要求澄清,但我需要评论区域中没有的空间和格式)
所以pstree会打印出来:
startserv --- expect --- /bin/sh --- srcds_linux
将小组分组为:
{startserv --- expect} --- {/bin/sh --- srcds_linux}
从startserv
您要杀死expect
,/bin/sh
和srcds_linux
,但查杀expect
不会导致expect
查杀它的直接孩子(更不用说那个孩子是那个孩子的团体)。
除了SIGKILL
之外的某些信号(例如SIGTERM
)可能导致expect
在终止自身之前导致/proc/*/stat
杀死其子(也可能是群组),但你可能已经尝试过了。
Baring你可以尝试查看expect
来构建一个进程树,找到你的SIGSTOP
进程(你已经知道它的pid),然后杀死它及其所有子进程。这不是完美的,因为它不是原子的(/ bin / sh可以分叉更多的孩子或其他东西),但是如果你想尝试捕获它,你可以发送这个子树expect
中的所有进程意识到他们在SIGCONT
子树下以稳定那棵树。然后向他们发送一个更强大的杀戮,然后可能是startserv
。
更自动的方法是让expect
创建一个psudoterminal来运行SIGHUP
(及其后代),然后关闭psudoterminal的控制端并希望所有这些程序在{{1}}上死亡。
答案 3 :(得分:0)
似乎最简单的方法就是使用bash。我可以简单地捕获ps axo pid,ppid的输出。我已经让第一个进程生成一个带有pid的锁文件,这样一个bash脚本就可以用父pid的ppid查找第一个项目,并将其与父项一起发送给SIGTERM。
答案 4 :(得分:0)
最后我的解决方案是: 获取父程序在程序中分叉的子项的pid(期望过程)。 将该pid与第一个进程的pid一起写入锁定文件。 编写一个bash脚本,查找哪些进程的父级具有第二个进程的pid。 终止bash脚本返回的第一个进程和进程ID。一切都干净利落。使用此方法最好使用killpg命令,我将看一下。