Shell 要更改pid的进程组吗

Shell 要更改pid的进程组吗,shell,unix,scripting,Shell,Unix,Scripting,想要杀死一棵树的进程例如,在A->B->C->D->E链中,我想杀死进程C、D、E,但不想杀死A和B 因此,我使用setpgid(PID_C,0)杀死C和C的所有子级。 它对C++工作很好。 但我想用脚本做同样的事情 有人能在这方面帮助我吗?我真的不明白你如何确定setpgid终止了你的进程链,通常setpgid函数将加入一个现有进程组或创建一个新的进程组。(它不是C++) 无论如何,下面的替代脚本应该可以工作 传递链父进程的进程id,即在您的情况下是进程的pidB 它递归地在给定pid的子进程

想要杀死一棵树的进程
例如,在
A->B->C->D->E
链中,我想杀死进程
C、D、E
,但不想杀死
A
B

因此,我使用
setpgid(PID_C,0)
杀死
C
C
的所有子级。 它对C++工作很好。 但我想用脚本做同样的事情

有人能在这方面帮助我吗?

我真的不明白你如何确定
setpgid
终止了你的进程链,通常
setpgid
函数将加入一个现有进程组或创建一个新的进程组。(它不是
C++

无论如何,下面的替代脚本应该可以工作

传递链父进程的进程id,即在您的情况下是进程的pid
B

它递归地在给定
pid
的子进程上循环,并从最下面的顺序用
9(SIGKILL)
信号通知每个要终止的子进程

#!/bin/sh

function getcpid() {
    cpids=`pgrep -P $1|xargs`
    #echo "cpids=$cpids"
    for cpid in $cpids;
    do
        #echo "$cpid"
        getcpid $cpid
        kill -9 cpid
    done
}

getcpid $1

kill-9 pid对我不起作用。。假设我给出了“kill-9pid_C”,那么它应该杀死C和C下的所有进程,在我的例子中,它只杀死C而不是它的子进程。因此,我使用setpgid()标记组中C(包括C)下的所有进程,然后终止该组。我提供的shell脚本仅在最上面的进程上调用
kill-9
。首先,它递归地杀死下面大多数子进程,然后处理一个级别,直到到达进程
C
并杀死它。