在 中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 kill
command kill
kill
/bin/kill
答案2
就您而言,涉及两个过程:
- 你的外壳。
man
您置于后台的进程。
该命令的具体工作方式kill
取决于你的 shell,但在大多数情况下,它是一个 shell 内置命令,基本上只是调用kill(2)
系统调用。正如您在手册页中看到的,0
是一个特殊值,表示“向当前进程组中的所有进程发送信号”。因此,当您键入时,kill 0
您会SIGTERM
向所有进程发送(这是默认信号)当前的进程组。
现在,真正的问题是:当前的流程组?长话短说,进程组被 shell 用来控制 shell 管道(例如/bin/echo hello | /usr/bin/wc -c
)。当你的 shell 运行一个新命令时,它会创建一个新的作为此命令一部分的进程的进程组(例如,在上面的示例中,它将创建一个包含两个进程的进程组:echo
和wc
)。
因此,在您的示例中,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) 中的所有内容。