ps 輸出中的 Wchan 部分未顯示任何內容

ps 輸出中的 Wchan 部分未顯示任何內容

我知道如果一個進程進入D狀態則意味著它處於不可中斷狀態。該行程不能被任何訊號殺死。它只會在重新啟動或 I/O 等待結束時退出該狀態。

我有很多進程處於D狀態,這表示我的機器有問題。即使重新啟動後,它們也會回到D狀態。我在網路上搜尋並發現wchanps 輸出中的部分告訴我的進程正在等待核心中的什麼內容。

當我使用這個命令時,ps axl| grep D我進入了-wchan 專欄,並且網路上沒有解釋這是什麼意思。

這是我的上述命令的範例輸出。

0     0  69970      1  20   0  25064  1088 -      D    ?          0:00 ls -l

我無法理解-上面輸出的意思。

答案1

-wchan 被報告為以下幾種可能的原因ps

  • 該進程只是沒有在核心中被阻止,即它正在運行(參見 psstate列)
  • 堆疊行走過程由於某些極端情況或競爭條件而失敗。它甚至可能無條件地失敗,例如,在需要正確的幀指標設定但在沒有它們的情況下編譯的內核上 - 檢查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 不顯示線程,則為「*」。

相關內容