Last Updated on 2022-08-08 by Clay
在 Linux 系統中,kill
指令是一個很常用的指令,因為很多時候當我們開發或是執行程式,我們都會碰上執行的程式突然卡住(stuck)的問題。這時候,我們就可以找出這個程式中自動被配發的 PID 碼,然後用 kill
指令殺死它。
然後我們會發現:咦!程式被終止了,我們的系統又順暢起來了!
但這一招並不是百分之百管用。我們來簡單看一下我們能發送的信號(signal)含義:
- HUP 1 終端斷線
- INT 2 中斷 (Ctrl + C)
- QUIT 3 退出 (Ctrl + \)
- TERM 15 終止
- KILL 9 強制終止
- CONT 18 繼續(與 STOP 相反)
- STOP 19 暫停(Ctrl + Z)
而預設的 kill 其實就是預設信號 15 的一般終止。當我們使用一般終止無法停止行程(process)時,若是確認砍掉該行程不會影響(比方說這個卡住的程式根本就是你寫的、不砍掉才是影響系統),我們就會開始嘗試使用 kill -9
來執行『強制終止』。
kill -9 <PID>
但今天我在使用 kill -9 殺死行程時,我第一次遇到無法成功終止行程的狀況。真的是非常傻眼。
但那程式又不會自動停止。最後摸索了好一陣子,這才勉強找到一個解決辦法。
解決方法-殺死父行程
有一種可能性是,雖然我們要求該行程(process)停止卡住、釋放資源,但是其父行程仍在持續調用它,所以實際上我們並無法成功殺死該行程。(也是我遇到的狀況)
那麼解決方法就簡單了。我們直接 kill
掉父行程。
再次強調,你真的需要確認不會影響你的系統才能去做。
首先,你先找到你想要的殺死的行程的 PID 碼,假設是 200330。
那麼,我們可以使用以下指令來查看其狀況:
cd /proc/200330
cat status | grep PPid
你所看到的 PPid,正是其父行程的 PID。那麼,接著只要殺死父行程即可。
References
- What if 'kill -9' does not work? - Unix & Linux Stack Exchange
- Not able to kill process by "kill -9 <PID>" [duplicate] - Ask Ubuntu