Kill 0 实际上做了什么?

Kill 0 实际上做了什么?

在 中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

上面,sleepps处于两个不同的进程组中,一个在后台,一个在前台,并且它们与shell的进程组不同。

不过你可以这样做:

(man kill & sleep 1; ps -j; kill 0)

交互式 shell 将为该子 shell 启动一个新的进程组,并且子 shell 和 man(以及由 man 启动的其他命令,如寻呼机、groff...)将位于同一个进程组中,因此kill 0可以在那里工作。 (sleep上面的内容是为了给寻呼机启动足够的时间,以便ps -j我们在杀死它之前可以在输出中看到它)。

相关内容