关闭这组流程的最佳方法是什么?

时间:2010-09-16 15:22:23

标签: c linux kill

我有以下一组进程,需要通过第一个列出的进程以编程方式关闭,这是我编写的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”的东西似乎有点傻(虽然看起来这会[几乎总是工作。帮助?

5 个答案:

答案 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/shsrcds_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命令,我将看一下。