【问题标题】:Kill a process which has same GID for another process杀死与另一个进程具有相同 GID 的进程
【发布时间】:2015-07-03 05:51:04
【问题描述】:

想杀死一棵树的进程。 例如:A->B->C->D->E 我想杀死进程 C、D、E,而不是 A 和 B。

假设所有进程的Parent id都是1234。

ps x -o  "%p %r %y %x %c 
{PID_A} 1234
{PID_B} 1234
{PID_C} 1234
{PID_D} 1234
{PID_E} 1234

我不能杀死 -9 -1234,因为它也会杀死 A 和 B。

【问题讨论】:

    标签: c++ unix process


    【解决方案1】:

    你不应该使用kill -9,除非是在kill -1kill -15(又名kill -HUPkill -TERM)等礼貌机制失败后的最后手段。

    您的问题以 A->B->C->D->E 开头,这表明 A 启动 B,B 启动 C,C 启动 D,D 启动 E。但是,然后您说 1234 是所有 B、C 的父 PID, D、E,可能还有 A(假设 A 不是 PID = 1234)。因此,在第二种情况下,您有 6 个进程:1234,以及 A 到 E,每个进程都由 1234 启动。

    在某些方面,这并不重要。在不杀死 A 和 B(以及 1234)的情况下杀死进程 C、D、E 的唯一方法是列出 C、D、E 的进程 ID。除非已采取措施将这三个进程放入同一进程组或会话作为彼此,并且在来自 A、B(和 1234)的单独进程组或会话中,没有任何替代方案。

    你可以看看kill()系统调用的规范:

    如果pid大于0,sig将被发送到进程ID等于pid的进程。

    如果pid为0,sig应发送给进程组ID等于进程组ID的所有进程(不包括未指定的系统进程集)发送者,并且进程有权为其发送信号。

    如果pid 为-1,则sig 应发送到所有进程(不包括未指定的系统进程集),该进程有权发送该信号。

    如果pid 为负数,但不是-1,则sig 应发送给进程组ID 等于的所有进程(不包括未指定的系统进程集) pid 的绝对值,进程有权发送信号。

    这些是可用的信号选项。这些选项都不适用于进程 1234 和 A ... E 的组织(杀死 C、D、E 并使 1234、A、B 不被杀死)。

    【讨论】:

    • 这只是一个例子,但实际上我不知道 C 有多少孩子或大孩子。那么有什么方法可以杀死所有的孩子,包括 C 的进程 ID 而不是 GID。 kill -9 PID_of_C 对我不起作用...
    • 只有当 C 使自己成为进程组组长并且它的子进程没有使自己成为进程组组长时,您才能杀死 C 及其所有后代。然后您可以向进程组发出信号。如果进程忽略或捕获信号并且不退出,那么它们就不会死亡。当然,你不能捕捉或忽略 SIGKILL,所以这是最后的手段——但过去的情况是,如果网络连接失败,使用 NFS(网络文件系统)文件的进程可能会被阻塞,而且没有办法即使使用 SIGKILL 也可以终止进程。重新启动或修复网络是修复它们的唯一方法。
    • 我有办法通过 setpgid() 杀死 C 和 C 下的孩子。我将 c 的进程 ID 分配给它的 c 组 ID 及其所有子代,它适用于 C++。但我想通过脚本而不是 C++ 代码来完成。有没有类似 c++ 中的 setpgid() 之类的 shell 脚本函数?
    • 没有。我没有仔细研究 Bash 的作用,但它肯定倾向于操纵进程组和会话等。编写一个类似于sunohup 风格的“cantrip”程序是可行的,它将自己放入一个新的进程组,然后运行作为参数给出的任何命令。这是简单的 C(或 C++,但我肯定会使用 C 来完成工作)代码。你甚至可以调用程序setpgid
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多