Process

如果’kill -9’不起作用怎麼辦?

  • April 26, 2021

我有一個無法殺死的程序kill -9 <pid>。在這種情況下有什麼問題,特別是因為我是該過程的所有者。我認為沒有什麼可以逃避這個kill選擇。

kill -9( SIGKILL ) 始終有效,前提是您有權終止該程序。基本上,要麼該程序必須由您啟動,而不是 setuid 或 setgid,要麼您必須是 root。有一個例外:即使是 root 也無法向 PID 1(init程序)發送致命信號。

但是kill -9不能保證立即生效。包括 SIGKILL 在內的所有信號都是非同步傳遞的:核心可能需要時間來傳遞它們。通常,傳遞一個信號最多需要幾微秒,這正是目標獲得時間片所需的時間。但是,如果目標已經阻塞了信號,則信號將排隊,直到目標解除阻塞。

通常,程序不能阻塞 SIGKILL。但是核心程式碼可以,並且程序在呼叫系統呼叫時執行核心程式碼。核心程式碼在中斷系統呼叫時會阻塞所有信號,這會導致核心中某處的資料結構格式錯誤,或者更一般地說,會違反某些核心不變數。因此,如果(由於錯誤或設計錯誤)系統呼叫無限期地阻塞,則實際上可能無法終止該程序。(但如果該程序完成了系統呼叫,它將被殺死。)

在系統呼叫中阻塞的程序處於不間斷睡眠狀態psor命令將top(在大多數 unices 上)以狀態顯示它D(我認為最初用於“ d isk”)。

一個典型的長期不間斷睡眠的例子是當伺服器沒有響應時程序通過NFS訪問文件。現代的實現往往不會強加不間斷的睡眠(例如在 Linux 下,intr掛載選項允許信號中斷 NFS 文件訪問)。

如果一個程序長時間處於不間斷的睡眠狀態,您可以通過將調試器附加到它,通過執行診斷工具(如stracedtrace(或類似工具,取決於您的 unix 風格))來獲取有關它正在做什麼的資訊,或者與其他診斷機制,例如在 Linux 下。參見Can’t kill wget process with kill -9了解更多關於如何在不間斷睡眠中調查程序的討論。/proc/*PID*/syscall

您有時可能會在or輸出中看到標記的條目Z(或者H在 Linux 下,我不知道有什麼區別) 。這些在技術上不是程序,它們是殭屍程序,它們只不過是程序表中的一個條目,保留在周圍,以便可以通知父程序其子程序死亡。當父程序注意(或死亡)時,它們將消失。ps``top

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