杀死0实际上会做什么?


10

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


您正在使用什么外壳?
FatalError 2013年

@FatalError我正在使用Bash
Firegun,2013年

Answers:


4

kill 0在kill手册页(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)一起在同一个进程组中,但这与外壳程序(在我的情况下为zsh)不同。

(2)可能有两个不同的kill命令。一个内置的bash(请参阅bash(1),“ SHELL BUILTIN COMMANDS”部分)和外部/bin/kill。这两个可能表现不同!您可以通过键入builtin killcommand kill而不是明确声明要运行哪一个kill。您还可以通过指定路径来运行外部命令:/bin/kill


1
PPID进程ID,通常但不一定是进程组ID。正确的列是PGID,它不会出现在默认ps输出中;您需要使用该-o选项来构造包含该选项的自定义格式。
chepner 2013年

@chepner:你说的很对,谢谢!我对Cygwin的ps(1)手册页感到困惑,该手册页指出:“ -l,--long:显示进程uid,ppid,pgid,winpids”。真可惜,我相应地修改了答案。但是,按照预期,我的声明(只有man + pager具有相同的PGID)现在是正确的。(在该句子之前是错误的:-(
mpy

1

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

kill -kill 0

这将信号9(SIGKILL信号)发送到进程组ID等于发送方进程组ID的所有进程。因为外壳程序不能忽略SIGKILL信号,所以这也会停止登录外壳程序并注销您

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

Linux功能“杀死”中不存在此功能(如我所见);但这是它的“杀死”行为:

杀死0并不意味着杀死pid0。相反,kill是杀死当前组中所有进程的一种选择。使用您的命令,您将杀死发出kill命令的外壳程序的进程组ID(GID)中的所有内容。

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.