Fir*_*gun 25 process kill process-groups
在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
Run Code Online (Sandbox Code Playgroud)
我在 bash 中尝试这样:
$ man kill &
[1] 15247
$
[1]+ Stopped man kill
$ kill 0
$ ps
15247 pts/41 00:00:00 man
Run Code Online (Sandbox Code Playgroud)
这里0用作pid. 据我了解,kill 0将杀死当前进程中的所有进程,其中包括pid15247. 然而,在这个例子中它没有做任何事情。有没有人有关于如何使用它的想法?
Sté*_*las 32
就像它说的那样,它将信号发送给调用者进程组的所有成员。
进程组用于在shell中实现作业控制(它们可以用于其他事情,但交互式shell作业控制是它们存在的主要原因)。
您会注意到,当您键入 时Ctrl-C,当前作业的所有进程都被终止,而不仅仅是启动它们的进程。此外,这不会杀死后台工作。
这是通过进程组实现的。作业是由shell启动的一组进程,shell可以将其置于后台或前台(设置为或不设置为终端的前台进程组),并作为一个整体杀死。
您可以使用ps -j(j用于Job 控制)了解进程组 ID 和会话 ID 。
要杀死 PGID 的进程组$x,您可以执行以下操作:
kill -- "-$x"
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
上面,sleep并且ps在两个不同的进程组中,一个在后台,一个在前台,它们与shell的进程组不同。
你可以这样做:
(man kill & sleep 1; ps -j; kill 0)
Run Code Online (Sandbox Code Playgroud)
交互式 shell 将为该子 shell 启动一个新的进程组,并且 subshell 和 man(以及由 man 启动的其他命令,如您的寻呼机、groff...)将在同一个进程组中,因此kill 0可以在那里工作。(sleep以上是为寻呼机启动提供足够的时间,以便我们可以在ps -j杀死它之前在输出中看到它)。