在 中man page
,它说:
kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
pid... Specify the list of processes that kill should signal. Each pid can be one of five things:
0 All processes in the current process group are signaled
我在 bash 中尝试过这样的操作:
$ man kill &
[1] 15247
$
[1]+ Stopped man kill
$ kill 0
$ ps
15247 pts/41 00:00:00 man
这里0
用作pid
.据我了解,kill 0
将杀死当前进程中的所有进程,其中包括pid15247
.然而,在这个例子中它没有做任何事情。有人对如何使用它有想法吗?
答案1
就像它所说的那样,它将信号发送给调用者进程组的所有成员。
进程组用于在 shell 中实现作业控制(它们可以用于其他用途,但交互式 shell 作业控制是它们存在的主要原因)。
您会注意到,当您输入 时Ctrl-C,当前作业的所有进程都会被终止,而不仅仅是启动它们的进程。此外,这不会终止后台作业。
这是通过进程组来实现的。作业是由 shell 启动的一组进程,shell 可以将其置于后台或前台(或不设置为终端的前台进程组),并作为一个整体杀死。
ps -j
您可以使用(j
用于Job 控制)找到有关进程组 id 和会话 id 的信息。
要终止 PGID 的进程组$x
,您可以:
kill -- "-$x"
kill 0
杀死调用者的进程组。
请注意,如果您这样做:/bin/kill 0
,shell 将启动一个新作业来执行该kill
命令,因此kill
只会杀死自己。
kill
通常是 shell 内置的,所以kill
会杀死 shell 的进程组。
但是,当 shell 是交互式时,它是管理进程组的进程,因此通常 shell 的进程组中没有其他进程。由 shell 启动的所有进程都位于其他进程组中:
$ sleep 1000 &
[1] 22746
$ ps -j
PID PGID SID TTY TIME CMD
22735 22735 22735 pts/23 00:00:00 zsh
22746 22746 22735 pts/23 00:00:00 sleep
22749 22749 22735 pts/23 00:00:00 ps
上面,sleep
和ps
处于两个不同的进程组中,一个在后台,一个在前台,并且它们与shell的进程组不同。
不过你可以这样做:
(man kill & sleep 1; ps -j; kill 0)
交互式 shell 将为该子 shell 启动一个新的进程组,并且子 shell 和 man(以及由 man 启动的其他命令,如寻呼机、groff...)将位于同一个进程组中,因此kill 0
可以在那里工作。 (sleep
上面的内容是为了给寻呼机启动足够的时间,以便ps -j
我们在杀死它之前可以在输出中看到它)。