【发布时间】: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。
【问题讨论】:
想杀死一棵树的进程。 例如: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。
【问题讨论】:
你不应该使用kill -9,除非是在kill -1 或kill -15(又名kill -HUP 或kill -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 不被杀死)。
【讨论】:
su 或nohup 风格的“cantrip”程序是可行的,它将自己放入一个新的进程组,然后运行作为参数给出的任何命令。这是简单的 C(或 C++,但我肯定会使用 C 来完成工作)代码。你甚至可以调用程序setpgid。