Ich weiß, dass ein Prozess, wenn er in diesen D
Zustand wechselt, sich in einem nicht unterbrechbaren Zustand befindet. Der Prozess kann nicht durch ein Signal beendet werden. Er verlässt diesen Zustand nur bei einem Neustart oder wenn die E/A-Wartezeit abgelaufen ist.
Ich habe viele Prozesse in D
einem Zustand, der anzeigt, dass mit meiner Maschine etwas nicht stimmt. Auch nach einem Neustart kehren sie in den D
Zustand zurück. Ich habe online gesucht und diesen wchan
Abschnitt in der PS-Ausgabe gefunden, der angibt, auf welche Sache im Kernel mein Prozess wartet.
Wenn ich diesen Befehl verwende, ps axl| grep D
gelange ich -
in die Wchan-Spalte und es gibt online keine Erklärung, was das bedeutet.
Dies ist meine Beispielausgabe für den obigen Befehl.
0 0 69970 1 20 0 25064 1088 - D ? 0:00 ls -l
Ich kann nicht verstehen, was -
die obige Ausgabe bedeutet.
Antwort1
Es gibt mehrere mögliche Gründe dafür, dass wchan als gemeldet wurde -
von ps
:
- der Prozess ist im Kernel nicht blockiert, d. h. er läuft (vgl. die
state
Spalte „ps“) - DieStack-Walking-Verfahrenschlägt aufgrund eines Sonderfalls oder einer Race Condition fehl. Es kann sogar bedingungslos fehlschlagen, z. B. bei Kerneln, die korrekte Frame-Pointer-Einstellungen erfordern, aber ohne diese kompiliert wurden - überprüfen Sie dies mit
cat /proc/*/wchan
- alle 0-Ausgaben weisen auf eine defekte Wchan-Unterstützung hin (z. B. derzeit der Fall beiFedora 31 und 32) - Duhabe nichtdas NötigeBerechtigungen für den Ptrace-Zugriffsmodus(nämlich
PTRACE_MODE_READ_FSCREDS
) - unwahrscheinlich - DieSymbolsuche schlägt fehlim Kernel - unwahrscheinlich
Beachten Sie, dass die aktuelle ps
Version die Wchan-Informationen liest, auf die Sie zum einfacheren Testen auch /proc/$pid/wchan
direkt zugreifen können . Diese Datei liest , wenn der Abruf der Wchan-Informationen fehlgeschlagen ist, was sich in übersetzt .cat
0
ps
-
Auf Systemen wo wchan
es defekt ist, gibt es einen Ersatz (erfordert Root):
cat /proc/$pid/stack
Oder konsultieren Sie alternativ (erfordert keine Root-Rechte):
cat /proc/$pid/syscall
Antwort2
im neueren Linux-Kernel sehen Sie, in welcher Kernelfunktion Ihr Prozess festhängt
cat /proc/<pid_numer>/stack
Antwort3
Die Manpage für PS enthält diese Information: „-“ bedeutet, dass der Prozess ausgeführt wird. WCHAN-Name der Kernelfunktion, in der der Prozess ruht, ein „-“, wenn der Prozess ausgeführt wird, oder ein „*“, wenn der Prozess mehrere Threads umfasst und PS keine Threads anzeigt.