プロセスが状態に入るとD
、割り込み不可能な状態になることを意味します。プロセスは、どのシグナルによっても終了できません。再起動時または I/O 待機が終了した場合にのみ、その状態から抜け出します。
D
マシンに何か問題があることを示す状態にあるプロセスが多数あります。また、再起動後も状態が元に戻ります。オンラインで検索したところ、 ps 出力のセクションに、プロセスがカーネル内で何を待機しているかが示されていることがD
わかりました。wchan
このコマンドを使用すると、 wchan 列ps axl| grep D
が表示されます-
が、これが何を意味するのかオンラインでは説明がありません。
これは上記のコマンドのサンプル出力です。
0 0 69970 1 20 0 25064 1088 - D ? 0:00 ls -l
-
上記の出力の意味が理解できません。
答え1
-
wchan が次のように報告される理由はいくつか考えられますps
:
- プロセスはカーネル内でブロックされていない、つまり実行中である(ps
state
列を参照) - のスタックウォーキング手順コーナーケースまたは競合状態が原因で失敗します。適切なフレームポインタ設定を必要とするカーネルで、それなしでコンパイルされた場合など、無条件に失敗することもあります。
cat /proc/*/wchan
すべて0の出力はwchanサポートが壊れていることを示します(現在、フェドラ 31 および 32) - あなた持っていない必要なptrace アクセスモード権限(すなわち
PTRACE_MODE_READ_FSCREDS
) - ありそうもない - のシンボル検索が失敗するカーネル内 - ありそうにない
最近のバージョンでは、テストを容易にするために、で直接アクセスできるps
wchan 情報も読み取られることに注意してください。wchan情報の取得に失敗した場合にそのファイルが読み取られ、に変換されます。/proc/$pid/wchan
cat
0
ps
-
が壊れているシステムでは、wchan
代替策として以下を参照してください (ルートが必要です):
cat /proc/$pid/stack
または、次の方法を参照してください (ルート権限は必要ありません)。
cat /proc/$pid/syscall
答え2
新しいLinuxカーネルでは、プロセスがどのカーネル関数で停止しているかがわかります
cat /proc/<pid_numer>/stack
答え3
ps のマニュアル ページには、この情報が記載されています。"-" はプロセスが実行中であることを意味します。プロセスがスリープしているカーネル関数の WCHAN 名。プロセスが実行中の場合は "-"、プロセスがマルチスレッドで ps がスレッドを表示していない場合は "*" になります。