Process

kill 0 實際上是做什麼的?

  • September 24, 2015

在 中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. 但是,在這個例子中它沒有做任何事情。有人對如何使用它有想法嗎?

就像它說的那樣,它將信號發送給呼叫者程序組的所有成員。

程序組用於在 shell 中實現作業控制(它們可以用於其他事情,但互動式 shell 作業控制是它們存在的主要原因)。

您會注意到,當您鍵入 時Ctrl-C,目前作業的所有程序都會被殺死,而不僅僅是啟動它們的程序。此外,這不會殺死後台作業。

這是通過程序組實現的。作業是由shell啟動的一組程序,shell可以將其置於後台或前台(是否設置為終端的前台程序組),並作為一個整體殺死。

ps -j您可以使用(j用於Job 控制)了解程序組 ID 和會話 ID 。

要殺死 PGID 的程序組$x,請執行以下操作:

kill -- "-$x"

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

上面,sleep並且ps在兩個不同的程序組中,一個在後台,一個在前台,它們與 shell 的程序組不同。

你可以這樣做:

(man kill & sleep 1; ps -j; kill 0)

互動式 shell 將為該子 shell 啟動一個新的程序組,並且子 shell 和 man(以及由 man 啟動的其他命令,例如您的尋呼機、groff …)都將在同一個程序組中,因此kill 0可以在那里工作。(sleep以上是為了給尋呼機啟動足夠的時間,這樣我們就可以在ps -j殺死它之前在輸出中看到它)。

引用自:https://unix.stackexchange.com/questions/67532