¿Es posible ver procesos muertos?

13

En man ps, establece claramente los diferentes estados que un proceso puede tener en Linux.

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.

Aunque Xes un estado de proceso, nunca debe verse. Pero eso es correcto? ¿Hay una manera teórica de ver eso como un estado en un proceso? ¿O es completamente 100% imposible?

xeor
fuente
2
El uso de should y el hecho de que esté en la página del manual implica que en realidad es posible verlo. Sin embargo, no tengo idea de cómo o cuándo.
terdon

Respuestas:

7

Me sumergí un poco en el kernel de Linux, sin saber cómo funciona en su núcleo interno, o ningún gran conocimiento de C. Así que por favor sé amable con esta teoría :)

El DEADestado se define https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141 y se usa en https://github.com/torvalds/linux/blob/master/fs /exec.c#L974 para dar solo un estado de devolución. Entonces, la única forma en que se puede ver es si verifica el estado del proceso antes de https://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (o más adelante donde sea que se llame esta función) desde..).

Si intenta matar un proceso muerto, se resolverá e ignorará en https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363

Entonces, en teoría ... creo que la respuesta es sí. X como estado puede verse en teoría, pero probablemente nunca haya estado en la vida real.

Por favor, corríjame si estoy equivocado. No estoy seguro de esto.

xeor
fuente
2
Puedo verlo conuntil 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
Así es como se ve el proceso (salida de /proc/.../stat); 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.. Pregunta respondida. ¡La X es posible! ¡Gracias!
xeor
1

Aquí hay evidencia de una que acabamos de encontrar en un sistema en vivo:

$ 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
fuente
¿Recuerdas si el proceso se había ido la próxima vez que corriste ps?
Hitechcomputergeek