![Killall 不會殺死所有並且很少殺死,那麼命令是什麼?](https://rvso.com/image/833372/Killall%20%E4%B8%8D%E6%9C%83%E6%AE%BA%E6%AD%BB%E6%89%80%E6%9C%89%E4%B8%A6%E4%B8%94%E5%BE%88%E5%B0%91%E6%AE%BA%E6%AD%BB%EF%BC%8C%E9%82%A3%E9%BA%BC%E5%91%BD%E4%BB%A4%E6%98%AF%E4%BB%80%E9%BA%BC%EF%BC%9F.png)
我偶爾會使用該killall
命令來終止進程。我之所以偶爾這麼說,是因為在某些情況下它對我不起作用。
最近的一個例子是 Thunderbird,記憶體中有大約 5 個實例,所以我決定使用該killall
命令。它殺死了 2 個進程,而 3 個進程仍然留在記憶體中。再次嘗試,3個仍然存在。
因此,我手動使用該kill -9
命令透過 pid 殺死每個單獨的進程。那行得通。
我主要使用該kill -9
命令,因為它有效。這個killall
命令讓我失望了很多次,我只是懶得使用它。但行不通一定是有原因的。難道是我用錯了?
我知道還有其他命令,pkill
但我很高興了解為什麼該killall
命令不能按預期工作。我甚至試圖只殺死一個進程,但這是一件碰運氣的事情。但該kill -9
指令每次都有效。
有任何想法嗎?
PS:sudo
沒有什麼區別
答案1
來自killall 的手冊頁
Killall 會向執行任何指定命令的所有進程發送訊號。如果未指定訊號名稱,則發送 SIGTERM。
當您執行 a 時kill -9
,您將發送 SIGKILL 訊號。如果你想用killall發送SIGKILL,你需要這樣做
killall -s SIGKILL <PROCESSNAME>
很好地解釋了 SIGKILL 和 SIGTERM 之間的差異(以及為什麼您應該先嘗試 SIGTERM)
從http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/
對於大多數系統管理員來說,在 Unix 系統上使用kill向程序發送訊號並不是一個新主題,但我多次被問到kill和kill -9之間的差異。
任何時候你對一個進程使用kill,你實際上是在向該進程發送一個信號(幾乎在所有情況下——我很快就會討論這一點)。標準 C 應用程式有一個頭文件,其中包含進程收到特定訊號時應遵循的步驟。您可以透過檢查kill 的手冊頁來取得系統上可用訊號的完整清單。
考慮這樣的命令:
kill 2563
這將向進程發送一個名為 SIGTERM 的訊號。一旦流程收到通知,可能會發生一些不同的事情:
- 該過程可能會立即停止
- 清理資源後,該進程可能會在短暫延遲後停止
- 該進程可能會無限期地繼續運行
一旦收到 SIGTERM,應用程式就可以確定它想要做什麼。雖然大多數應用程式會清理資源並停止,但有些應用程式可能不會。應用程式可以設定為在收到 SIGTERM 時執行完全不同的操作。此外,如果應用程式處於不良狀態,例如等待磁碟 I/O,它可能無法對發送的訊號進行操作。
當應用程式不回應 SIGTERM 時,大多數系統管理員通常會訴諸更突然的訊號:
kill -9 2563
-9 告訴kill 指令您要傳送訊號#9,稱為SIGKILL。有了這樣的名字,顯然這個訊號的分量更大一些。
儘管SIGKILL與SIGTERM定義在同一個訊號頭檔中,但它不能被進程忽略。事實上,該進程甚至沒有意識到 SIGKILL 訊號,因為該訊號直接進入核心 init。此時,init 將停止該進程。該進程永遠沒有機會捕獲信號並對其採取行動。
然而,在某些情況下核心可能無法成功殺死進程。如果進程正在等待網路或磁碟 I/O,核心將無法阻止它。殭屍行程和陷入不間斷睡眠的進程也不能被核心停止。需要重新啟動才能從系統中清除這些進程。
當您向 Thunderbird 程序發送killall (SIGTERM) 時,您要求停止這些進程。其中一些進程無法正常工作(這可能是您首先需要終止它們的原因),因此它們無法對 SIGTERM 訊號採取行動。
答案2
killall
接受與 大部分相同的語法kill
。特別是,不需要編寫任何花哨的東西來完成killall
與kill -9
.這工作得很好:
killall -9 thunderbird
(當然,正如所討論的,您通常應該不願意使用killall -9
或 ,killall -KILL
除非已經嘗試過其他措施但沒有成功。)
答案3
對於那些尋求快速答案的人:
sudo killall -s SIGTERM processname