Bash
kill -9 後台工作也會殺死 bash
sleep 1 & kill -9 $?
以上將殺死(很可能)bash shell 或目前終端視窗。
這是為什麼?
注意:
sleep 1 & kill $?
不會殺死外殼/終端。只是為了確保我不會執行我認為的不同的東西,有一些競爭條件等,以下也會產生相同的效果:
/bin/sleep 2 & pid=$?; sleep 1; kill -9 $pid
GNU bash,版本 5.0.3(1)-發布
$?
是最後一個命令的退出狀態。啟動後台命令總是成功的,所以在 中… & do_something_with $?
, 的值為$?
0。你正在執行kill -9 0
。傳遞給 shell 命令的 PID
kill
被傳遞給底層系統呼叫。Shell 手冊沒有記錄它可以是 PID 以外的東西,但係統呼叫手冊卻有。如果 PID 為 0,則表示目前程序組中的所有程序。(並且 -1 表示除 PID 1 之外的每個程序,另一個負值表示指定程序組中的每個程序。)在終端中執行的 shell 位於其自己的程序組中(除非您經過大量的循環或存在子 shell不在後台作業中),因此kill -9 0
相當於kill -9 $$
:它殺死了 shell 程序。任何後台程序,例如
sleep
命令,都會繼續執行。它沒有收到信號,外殼甚至沒有機會發送信號。終端的當機通常也不會影響它,儘管某些程序在嘗試寫入已關閉的終端時可能會出錯(當然sleep
不會這樣做)。
kill 0
發送 TERM 信號,shell 忽略該信號。kill -9 0
發送 KILL 信號,不可忽略。如果您打算殺死最近的後台程序,那就是
$!
.