进程组是什么,已经有人问过并回答过这里:
进程组是可以同时发出信号的相关进程的集合。
不幸的是,没有现实世界的例子来说明如何以及何时启动“一系列可以立即发出信号的相关进程”。
这里有人能给我一些代码示例,说明他在哪里启动进程组并使用 杀死其中的所有进程kill -- -0
吗?
例如,apache web 服务器及其子进程是否会成为一个进程组,当主进程被杀死时,进程组内的其余 PID 也会被杀死?
答案1
现实世界中有很多例子;some_app
从链接的问题可以是ls
或者cat
或者 更复杂的例子
$ ps axo ppid,pid,pgid,command | grep $$
41613 2926 2926 mksh -l
2926 14131 14131 ps axo ppid,pid,pgid,command
2926 14132 14131 grep 2926
$
这表明 shell ( mksh
) 已启动一个新的进程组 ( 14131
),其成员为14131
和14132
。如果不是因为它们不徘徊,它们可能会被发出信号;为此,您需要sleep
某种形式的阻止
$ perl -e 'warn $$; sleep 999' | perl -ne 'sleep 999'
14148 at -e line 1.
然后你可以跑去其他地方kill -- -14148
杀死那群人。
答案2
例子:
$ ( sleep 100 & sleep 100 & sleep 100 & )
$ ps -Ao pid,pgid,command | grep sleep
19734 19733 sleep 100
19735 19733 sleep 100
19736 19733 sleep 100
19789 19788 grep sleep
()
创建一个新的子shell(至少在Bash中),它将成为所有启动进程的进程组领导者(IOW:shell将创建一个新的子shell,其PID将是所有三个睡眠的PGID,它将异步执行在后台)。
要消除那些睡眠,只需键入即可kill -19733
。
另一个例子:
$ cat script1.sh
sleep 100 &
./script2.sh
$ cat script2.sh
sleep 100 &
$ ./script1.sh
$ ps -Ao pid,pgid,command | grep sleep
21605 21604 sleep 100
21607 21604 sleep 100
21618 21617 grep sleep
或者sleep 10 | sleep 20 | sleep 30 | sleep 40 &
也将共享相同的 PGID。