Möglich, tote Prozesse zu sehen?

13

In man psgibt es deutlich die verschiedenen Zustände an, die ein Prozess unter Linux haben kann.

D    Uninterruptible sleep (usually IO)
R    Running or runnable (on run queue)
S    Interruptible sleep (waiting for an event to complete)
T    Stopped, either by a job control signal or because it is being traced.
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    Defunct ("zombie") process, terminated but not reaped by its parent.

Auch wenn Xes sich um einen Prozesszustand handelt, sollte er niemals gesehen werden. Aber ist das richtig? Gibt es eine theoretische Möglichkeit, dies als Zustand eines Prozesses zu betrachten? Oder ist es zu 100% unmöglich?

xeor
quelle
2
Die Verwendung von sollte und die Tatsache, dass es in der Manpage ist, implizieren, dass es tatsächlich möglich ist, es zu sehen. Ich habe keine Ahnung wie oder wann.
Terdon

Antworten:

6

Ich habe mich ein wenig mit dem Linux-Kernel befasst, ohne zu wissen, wie er in seinem inneren Kern funktioniert, oder ohne große C-Kenntnisse. Also sei bitte nett mit dieser Theorie :)

Der DEADStatus ist unter https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141 definiert und wird unter https://github.com/torvalds/linux/blob/master/fs verwendet /exec.c#L974 , um nur einen Rückgabestatus anzugeben . Die einzige Möglichkeit, die jemals gesehen werden kann, besteht darin, den Prozessstatus zu überprüfen, bevor https://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (oder später, wo immer diese Funktion aufgerufen wird) von..).

Wenn Sie versuchen, einen toten Prozess zu beenden, wird dieser unter https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363 behoben und ignoriert

Also in der Theorie ... ich denke die Antwort ist ja. X als Zustand kann in der Theorie gesehen werden, war aber wahrscheinlich noch nie im wirklichen Leben.

Bitte korrigieren Sie mich, wenn / wo ich falsch liege. Ich bin mir da überhaupt nicht sicher.

xeor
quelle
2
Ich kann es sehen mituntil sleep 0.4 & perl -e '$p = shift; while (1) {open A, "</proc/$p/stat" or last; $_=<A>; print}' $! | grep X; do :; done
Stéphane Chazelas
So sieht der Prozess (Ausgabe von /proc/.../stat) aus; 4603 (sleep) X 0 -1 -1 0 -1 4202508 0 0 0 0 0 0 0 0 20 0 0 0 175042279 0 0 0 0 0 0 0 0 0 0 0 0 18446744071579306375 0 0 17 0 0 0 0 0 0.. Frage beantwortet. Das X ist möglich! Vielen Dank!
xeor
1

Hier ist ein Beweis für einen, dem wir gerade auf einem Live-System begegnet sind:

$ sudo ps axf -O wchan
31103 -      R ?        00:00:00 /bin/bash /usr/local/bin/monitorcron taskA
31104 exit   X ?        00:00:00  \_ [su]
slm
quelle
Erinnern Sie sich, ob der Prozess beim nächsten Mal beendet war ps?
Hitechcomputergeek