Possível ver processos mortos?

13

Em man ps, afirma claramente os diferentes estados que um processo pode ter no 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.

Mesmo Xsendo um estado de processo, nunca deve ser visto. Mas isso está correto? Existe uma maneira teórica de ver isso como um estado em um processo? Ou é completamente 100% impossível?

xeor
fonte
2
O uso de should e o fato de ele estar na página de manual implica que é realmente possível vê-lo. Não tenho idéia de como ou quando.
terdon

Respostas:

7

Mergulhei um pouco no kernel do Linux, sem o conhecimento de como ele funciona em seu núcleo interno ou qualquer grande conhecimento em C. Então, por favor, seja legal com essa teoria :)

O DEADestado é definido https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141 e é usado em https://github.com/torvalds/linux/blob/master/fs /exec.c#L974 para fornecer apenas um status de retorno. Portanto, a única maneira de ver isso é se você verificar o estado do processo antes em https://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (ou mais tarde, sempre que essa função for chamada a partir de..).

Se você tentar eliminar um processo morto, ele será tratado e ignorado em https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363

Então, em teoria ... acho que a resposta é sim. X como um estado pode ser visto na teoria, mas provavelmente nunca esteve na vida real.

Por favor, corrija-me se / onde estiver errado .. Não tenho certeza disso.

xeor
fonte
2
Eu posso ver comuntil 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
Aqui está a aparência do processo (saída 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.. Pergunta respondida. O X é possível! Obrigado!
xeor
1

Aqui está a evidência de um que acabamos de encontrar em um sistema ativo:

$ 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
fonte
Você se lembra se o processo foi encerrado na próxima vez que você foi executado ps?
Hitechcomputergeek