È possibile vedere i processi morti?


13

In man ps, indica chiaramente i diversi stati che un processo può avere su 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.

Anche se Xè uno stato del processo, non dovrebbe mai essere visto. Ma è corretto? C'è un modo teorico di vederlo come uno stato in un processo? O è completamente impossibile al 100%?


2
L'uso di should e il fatto che sia nella pagina man implicano che è effettivamente possibile vederlo. Non ho idea di come o quando.
terdon

Risposte:


7

Ho fatto un piccolo tuffo nel kernel di Linux, senza sapere come funziona nel suo nucleo interno o nessuna grande conoscenza del C. Quindi per favore sii gentile con questa teoria :)

Lo DEADstato è definito https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141 ed è utilizzato su https://github.com/torvalds/linux/blob/master/fs /exec.c#L974 per dare solo uno stato di ritorno. Quindi l'unico modo in cui può mai essere visto è se si controlla prima lo stato del processo intorno a https://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (o più tardi ovunque venga chiamata questa funzione a partire dal..).

Se si tenta di uccidere un processo morto, questo verrà curato e ignorato su https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363

Quindi in teoria ... Penso che la risposta sia sì. X come stato può essere visto in teoria, ma probabilmente non è mai stato nella vita reale.

Per favore, correggimi se / dove mi sbaglio .. Non ne sono affatto sicuro ..


2
Posso vederlo 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 il

Ecco come appare il processo (output di /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.. Domanda risposta. La X è possibile! Grazie!
xeor

1

Ecco la prova di uno che abbiamo appena incontrato su un sistema live:

$ sudo ps axf -O wchan
31103 -      R ?        00:00:00 /bin/bash /usr/local/bin/monitorcron taskA
31104 exit   X ?        00:00:00  \_ [su]

Ricordi se il processo è stato interrotto la prossima volta che hai eseguito ps?
Hitechcomputergeek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.