kill 0 實際上是做什麼的?
在 中
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
用於J
ob 控制)了解程序組 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
殺死它之前在輸出中看到它)。