kill -9 掛起,無法殺死程序(謀殺證明程序)
可能重複:
我想問這個有點晚了,但供將來參考;
今天在客戶報告使用 ssh 連接速度很慢並且執行命令也很慢(有些根本不工作)之後,我被要求查看伺服器。
登錄後我可以及時輸入,所以我認為這不是網路問題,例如延遲或頻寬飽和(因為我發現這往往與您的 ssh 體驗直接相關)。我第一次嘗試執行
top
,一分鐘後什麼也沒發生,我用 CTRL+C 取消了這個操作。提示掛起等待top
啟動。
free -m
在我取消之前,我也只是在提示符下掛了一分鐘或更長時間。
df -h
確實執行了,並告訴我有 60% 的磁碟空間可用(我想知道是否某些應用程序已經失效並用日誌填滿了磁碟)。
dmesg
也不會執行。我執行了
tail -n 50 /var/log/message
,遺憾的是我不再有輸出,但看起來有一個嚴重的問題。許多記憶體位置以十六進制列印,並且可能在右側顯示它們的內容(難以理解的雜亂無章)。它與我在Google上找到的這個日誌中的輸出非常相似,試圖找到一個類似的例子,除了在右邊的列中大部分行都包含“ext4”,可能是文件系統錯誤?執行
tail -n 50 /var/log/syslog
時,我看到這裡重複的所有記憶瘋狂中間有幾行說有效Info procname:pid blocked for more than 120 seconds
。我執行
ps aux
並查看了輸出,直到找到一個 CPU 使用率為 299% 的程序;
ps aux | grep procname
procuser 8279 299 0.0 479064 41916 pts/6 Sl+ 08:05 548:31 /path/to/procname procbox 6390 6394 6395 0
所以這個過程看起來很瘋狂,但我無法執行任何與記憶體相關的命令(有或沒有 sudo)。例如
free -m
,或top
。我可以cat /proc/meminfo
看到 40GB 的可用 RAM 中大約有 5GB。我試過
kill PID
了,但掛了幾分鐘後我放棄了。我試過kill -9 PID
了,但又一次,同樣的事情。我只能假設這個程序太忙了以至於它無法回答來自核心的終止消息?我試過了renice 19 PID
,kill -9 PID
但這也不起作用,renice
會執行,只是掛起。最後需要硬重啟,這並不理想。由於伺服器上的專業應用程序,文件現在已損壞等。我還有什麼其他選擇?
有沒有辦法簡單地停止一個過程?與其發送 SIGTERM,不如直接停止程式碼處理,還是類似的?
我執行了 tail -n 50 /var/log/message ,遺憾的是我不再有輸出,但看起來有一個嚴重的問題。許多記憶體位置以十六進制列印,並且可能在右側顯示它們的內容(難以理解的雜亂無章)。
它幾乎可以是任何東西,這些核心轉儲的內容對於了解它是什麼很重要。
例如,您可能遇到了硬體問題,例如不再響應請求的磁碟。嘗試執行已經記憶體在 RAM 中的程序可以正常工作,而執行需要從磁碟讀取的程序可能會掛起。
也可能是您遇到了核心錯誤,或其他一些驅動程序問題,或者您的 RAM 中有一個壞位翻轉,或者幾乎有任何其他壞硬體。如果驅動程序鎖定了核心中的特定資源,然後遇到錯誤或錯誤並且未能正確解鎖它,那麼任何其他嘗試獲取該鎖定的驅動程序或系統呼叫都會掛起。
它可能不是核心中的錯誤。例如,當使用 lvm 或 dmsetup 工具管理磁碟時,您可能會遇到這種行為。它們都可以掛起一個設備,結果是“只要設備被掛起,對該設備的任何進一步的 I/O 都將被推遲”。然後嘗試訪問該設備的程序將簡單地阻塞在核心中。您可以使用“dmsetup suspend”手動觸發此操作,或者當 LVM 工具遇到錯誤時,我看到磁碟意外處於掛起狀態。
如果這是一次性的事情,請不要出汗。如果它再次發生,請嘗試仔細記錄核心輸出,以便追踪其原因。第一個故障轉儲將是最重要的。如果它經常發生並且您無法獲得輸出,請考慮使用netconsole將核心輸出直接發送到另一台機器。