如果’kill -9’不起作用怎麼辦?
我有一個無法殺死的程序
kill -9 <pid>
。在這種情況下有什麼問題,特別是因為我是該過程的所有者。我認為沒有什麼可以逃避這個kill
選擇。
kill -9
( SIGKILL ) 始終有效,前提是您有權終止該程序。基本上,要麼該程序必須由您啟動,而不是 setuid 或 setgid,要麼您必須是 root。有一個例外:即使是 root 也無法向 PID 1(init
程序)發送致命信號。但是
kill -9
不能保證立即生效。包括 SIGKILL 在內的所有信號都是非同步傳遞的:核心可能需要時間來傳遞它們。通常,傳遞一個信號最多需要幾微秒,這正是目標獲得時間片所需的時間。但是,如果目標已經阻塞了信號,則信號將排隊,直到目標解除阻塞。通常,程序不能阻塞 SIGKILL。但是核心程式碼可以,並且程序在呼叫系統呼叫時執行核心程式碼。核心程式碼在中斷系統呼叫時會阻塞所有信號,這會導致核心中某處的資料結構格式錯誤,或者更一般地說,會違反某些核心不變數。因此,如果(由於錯誤或設計錯誤)系統呼叫無限期地阻塞,則實際上可能無法終止該程序。(但如果該程序完成了系統呼叫,它將被殺死。)
在系統呼叫中阻塞的程序處於不間斷睡眠狀態。
ps
or命令將top
(在大多數 unices 上)以狀態顯示它D
(我認為最初用於“ d isk”)。一個典型的長期不間斷睡眠的例子是當伺服器沒有響應時程序通過NFS訪問文件。現代的實現往往不會強加不間斷的睡眠(例如在 Linux 下,
intr
掛載選項允許信號中斷 NFS 文件訪問)。如果一個程序長時間處於不間斷的睡眠狀態,您可以通過將調試器附加到它,通過執行診斷工具(如strace或dtrace(或類似工具,取決於您的 unix 風格))來獲取有關它正在做什麼的資訊,或者與其他診斷機制,例如在 Linux 下。參見Can’t kill wget process with
kill -9
了解更多關於如何在不間斷睡眠中調查程序的討論。/proc/*PID*/syscall
您有時可能會在or輸出中看到標記的條目
Z
(或者H
在 Linux 下,我不知道有什麼區別) 。這些在技術上不是程序,它們是殭屍程序,它們只不過是程序表中的一個條目,保留在周圍,以便可以通知父程序其子程序死亡。當父程序注意(或死亡)時,它們將消失。ps``top