Czy można zobaczyć martwe procesy?

13

W man psjasno określa różne stany procesu w Linuksie.

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.

Nawet jeśli Xjest to stan procesu, nigdy nie należy go widzieć. Ale czy to prawda? Czy istnieje teoretyczny sposób postrzegania tego jako stanu procesu? Czy to całkowicie niemożliwe w 100%?

Xeor
źródło
2
Użycie polecenia powinno oraz fakt, że znajduje się on na stronie podręcznika implikuje, że faktycznie można go zobaczyć. Nie mam jednak pojęcia, jak i kiedy.
terdon

Odpowiedzi:

7

Zanurzyłem się trochę w jądrze Linuksa, nie wiedząc, jak działa w jego rdzeniu ani jakiejkolwiek dużej znajomości języka C. Więc proszę bądź miły z tą teorią :)

DEADStan określa https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141 i jest stosowany w https://github.com/torvalds/linux/blob/master/fs /exec.c#L974, aby dać tylko status zwrotu. Jedynym sposobem, w jaki można to kiedykolwiek zobaczyć, jest sprawdzenie stanu procesu przed https://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (lub później, gdziekolwiek ta funkcja zostanie wywołana z..).

Jeśli spróbujesz zabić martwy proces, zostanie to załatwione i zignorowane na https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363

Więc teoretycznie ... Myślę, że odpowiedź brzmi tak. X jako stan można postrzegać w teorii, ale prawdopodobnie nigdy nie był w prawdziwym życiu.

Proszę mnie poprawić, jeśli / gdzie się mylę .. W ogóle nie jestem tego pewien ...

Xeor
źródło
2
Widzę to zuntil 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
Oto jak wygląda proces (wynik działania /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.. Odpowiedzi na pytanie. X jest możliwy! Dzięki!
xeor
1

Oto dowód takiego, na który właśnie natknęliśmy się na system na żywo:

$ 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
źródło
Czy pamiętasz, czy proces zniknął przy następnym uruchomieniu ps?
Hitechcomputergeek