杀死0实际上会做什么?[关闭]


22

在中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。但是,在此示例中它什么也没做。有人对使用它有想法吗?


它向SIGTERM完成的过程发送一个。该man命令已选择忽略它。
jordanm 2013年

5
@jordanm,不。由交互式外壳启动的作业与外壳具有不同的进程组。这就是外壳将其放置在前景和背景中的方式。请参阅ps -j以查看过程组。
斯特凡Chazelas

1
这个问题实际上是SuperUser问题的副本,杀死0实际上是做什么的?(已从StackOverflow迁移)。在StackOverflowUnix.SE上也可以查看有关kill -0(注意破折号)的问题,这是一个不同的主题。
亚当·卡兹

Answers:


27

就像它说的那样,它将信号发送给调用者的进程组的所有成员。

进程组用于在Shell中实现作业控制(它们可以用于其他用途,但是交互式Shell作业控制是它们存在的主要原因)。

您会注意到,键入时Ctrl-C,将杀死当前作业的所有进程,而不仅仅是启动它们的进程。而且,这不会杀死后台作业。

这是通过过程组来实现的。作业是由外壳程序启动的一组进程,外壳程序可以将该外壳程序放在后台或前台(是否设置为终端的前台进程组),并整体上将其终止。

您可以使用ps -jj用于Job控制)查找有关进程组ID和会话ID的信息。

要终止PGID的进程组$x,请执行以下操作:

kill -- "-$x"

kill 0 杀死调用方的进程组。

请注意,如果您执行以下操作:/bin/kill 0,shell将启动一个新作业来执行该kill命令,因此kill只会杀死自己。

kill通常是内置的shell,因此kill会杀死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)

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


kill -- -$x实际上是bash: kill: (-63531) - No such process在MacOS 10.14上的bash 5.0.11(1)-发行版中说的,但是可以确定进程存在并且正在运行。pkill -P工作正常
kyb

1
@kyb $ x必须是进程组ID,而不是进程ID。见的输出ps -j,以了解呼叫群组身分
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.