我知道如果一個進程進入D
狀態則意味著它處於不可中斷狀態。該行程不能被任何訊號殺死。它只會在重新啟動或 I/O 等待結束時退出該狀態。
我有很多進程處於D
狀態,這表示我的機器有問題。即使重新啟動後,它們也會回到D
狀態。我在網路上搜尋並發現wchan
ps 輸出中的部分告訴我的進程正在等待核心中的什麼內容。
當我使用這個命令時,ps axl| grep D
我進入了-
wchan 專欄,並且網路上沒有解釋這是什麼意思。
這是我的上述命令的範例輸出。
0 0 69970 1 20 0 25064 1088 - D ? 0:00 ls -l
我無法理解-
上面輸出的意思。
答案1
-
wchan 被報告為以下幾種可能的原因ps
:
- 該進程只是沒有在核心中被阻止,即它正在運行(參見 ps
state
列) - 這堆疊行走過程由於某些極端情況或競爭條件而失敗。它甚至可能無條件地失敗,例如,在需要正確的幀指標設定但在沒有它們的情況下編譯的內核上 - 檢查
cat /proc/*/wchan
- 所有 0 輸出表示破壞了 wchan 支援(例如,當前的情況Fedora 31 和 32) - 你沒有必要ptrace 存取模式權限(即
PTRACE_MODE_READ_FSCREDS
) - 不太可能 - 這符號查找失敗在內核中 - 不太可能
請注意,最近的ps
版本讀取了 wchan 信息/proc/$pid/wchan
,您也可以直接從中訪問cat
,以便於測試。0
如果 wchan 資訊檢索失敗,則讀取該文件,並將其ps
轉換為-
.
在損壞的系統上,wchan
替代方法是查看(需要 root):
cat /proc/$pid/stack
或者,請參閱(不需要 root 權限):
cat /proc/$pid/syscall
答案2
在較新的 Linux 核心中,您可以看到進程卡在哪個核心函數中
cat /proc/<pid_numer>/stack
答案3
ps 的手冊頁有此訊息,「-」表示進程正在運作。進程正在休眠的核心函數的 WCHAN 名稱,如果進程正在運行,則為「-」;如果進程是多線程且 ps 不顯示線程,則為「*」。