kill 0 实际上起什么作用?

kill 0 实际上起什么作用?

在 中man page,它说:

          0      All processes in the current process group are signaled

我尝试过这样的:

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

据我了解,kill 0将终止当前进程中的所有进程,包括pid15247。但是,它在此示例中没有执行任何操作。有人知道如何使用它吗?

答案1

kill 0我在我的 kill man 页面(debian)中找不到有关其行为方式的说明。

但我有两点意见:

(1)“进程组”可能不是您所期望的。您可以使用以下命令显示进程组 ID (PGID) ps -o "%p %P %r %c %a"

$ ps -o "%p %P %r %c %a"
  PID  PPID  PGID COMMAND         COMMAND
12124 12123 12124 zsh             -zsh
12212 12124 12212 man             man kill
12226 12212 12212 less            less
12302 12124 12302 ps              ps -o %p %P %r %c %a

因此,man与显示分页工具(less)位于同一进程组中,但与 shell(在我的情况下为 zsh)的进程组不同。

(2) 可能有两个不同的kill命令。一个是内置命令bash(请参阅 bash(1) 中的“SHELL 内建命令”一节),另一个是外部命令。这两个命令的行为可能不同!您可以通过键入或而不是 来/bin/kill明确说明要运行哪一个命令。您还可以通过指定路径来运行外部命令:。builtin killcommand killkill/bin/kill

答案2

就您而言,涉及两个过程:

  1. 你的外壳。
  2. man您置于后台的进程。

该命令的具体工作方式kill取决于你的 shell,但在大多数情况下,它是一个 shell 内置命令,基本上只是调用kill(2)系统调用。正如您在手册页中看到的,0是一个特殊值,表示“向当前进程组中的所有进程发送信号”。因此,当您键入时,kill 0您会SIGTERM向所有进程发送(这是默认信号)当前的进程组。

现在,真正的问题是:当前的流程组?长话短说,进程组被 shell 用来控制 shell 管道(例如/bin/echo hello | /usr/bin/wc -c)。当你的 shell 运行一个新命令时,它会创建一个新的作为此命令一部分的进程的进程组(例如,在上面的示例中,它将创建一个包含两个进程的进程组:echowc)。

因此,在您的示例中,shell 将为其man启动的进程(及其所有子进程)创建一个新的进程组,您可以通过运行来查看它:

$ ps -o pid,ppid,pgid,comm

(PPID是父PID,PGID是进程组)。

然后你输入kill 0你的shell,它位于它自己的进程组中(记住,它创建了一个新的进程组为man)。因此,所发生的一切将被SIGTERM传递给 shell 进程组中的所有进程,也就是 shell 本身(它会忽略SIGTERM)。

答案3

要停止所有进程并注销自己,请输入:

kill -kill 0

这将向所有进程组 ID 等于发送者进程组 ID 的进程发送信号 9(SIGKILL 信号)。由于 shell 无法忽略 SIGKILL 信号,因此这也会停止登录 shell 并注销您

这是 IBM 的 AIX 手册,但也许其概念适用。

Linux“kill”中不存在此功能(正如我所看到的);但是它的“杀死”行为如下:

Kill 0 并不是杀死 pid 0。相反,它是 kill 中的一个选项,用于杀死当前组。使用您的命令,您将终止发出 kill 命令的 shell 的进程组 ID (GID) 中的所有内容。

相关内容