Possible de voir des processus morts?

13

Dans man ps, il indique clairement les différents états qu'un processus peut avoir sous 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.

Même si Xc'est un état de processus, il ne devrait jamais être vu. Mais est-ce exact? Existe-t-il une manière théorique de voir cela comme un état d'un processus? Ou est-ce complètement impossible à 100%?

xeor
la source
2
L'utilisation de should et le fait qu'il se trouve dans la page de manuel impliquent qu'il est réellement possible de le voir. Je ne sais pas comment ni quand.
terdon

Réponses:

7

J'ai plongé un peu dans le noyau Linux, sans savoir comment il fonctionne dans son noyau interne, ni aucune grande connaissance en C. Alors soyez gentil avec cette théorie :)

L' DEADétat est défini https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141 et est utilisé à https://github.com/torvalds/linux/blob/master/fs /exec.c#L974 pour donner un statut de retour uniquement. Donc, la seule façon de le voir est de vérifier l'état du processus avant autour de https://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (ou plus tard partout où cette fonction est appelée de..).

Si vous essayez de tuer un processus mort, il sera pris en charge et ignoré à https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363

Donc en théorie ... je pense que la réponse est oui. X comme un état peut être vu en théorie, mais n'a probablement jamais été dans la vraie vie.

Veuillez me corriger si / où je me trompe .. Je n'en suis pas sûr du tout ..

xeor
la source
2
Je peux le voir avecuntil 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
Voici à quoi ressemble le processus (sortie 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.. Réponse à la question. Le X est possible! Merci!
xeor
1

Voici la preuve de celui que nous venons de rencontrer sur un système en direct:

$ 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
la source
Vous souvenez-vous si le processus a été arrêté la prochaine fois que vous avez couru ps?
Hitechcomputergeek