Можно ли увидеть мертвые процессы?

13

В man psнем четко указаны различные состояния, которые процесс может иметь в 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.

Даже если Xэто состояние процесса, его никогда не должно быть видно. Но так ли это? Есть ли теоретический способ увидеть это как состояние процесса? Или это на 100% невозможно?

xeor
источник
2
Использование следует и тот факт, что он находится на странице руководства, означает, что это действительно возможно увидеть. Я понятия не имею, как и когда, хотя.
Тердон

Ответы:

7

Я немного погрузился в ядро ​​Linux, не зная о том, как оно работает во внутреннем ядре, и не разбираясь в больших знаниях Си. Поэтому, пожалуйста, будьте милы с этой теорией :)

DEADСостояние определяется https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141 и используется на https://github.com/torvalds/linux/blob/master/fs /exec.c#L974 только для возврата статуса. Таким образом, единственный способ, которым это когда-либо можно увидеть, - это если вы проверяете состояние процесса прежде, чем вокруг https://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (или позже, где бы эта функция ни вызывалась из..).

Если вы попытаетесь убить мертвый процесс, об этом позаботятся и проигнорируют по адресу https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363.

Так что в теории ... я думаю, что ответ - да. X как состояние можно увидеть в теории, но, вероятно, никогда не было в реальной жизни ..

Пожалуйста, поправьте меня, если / где я ошибаюсь .. Я совсем не уверен в этом ..

xeor
источник
2
Я могу видеть это сuntil sleep 0.4 & perl -e '$p = shift; while (1) {open A, "</proc/$p/stat" or last; $_=<A>; print}' $! | grep X; do :; done
Стефан Chazelas
Вот как выглядит процесс (вывод /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.. Вопрос ответил. Х возможно! Благодарность!
xeor
1

Вот свидетельство того, с чем мы только что столкнулись в живой системе:

$ 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
источник
Помните ли вы, что процесс исчез при следующем запуске ps?
Hitechcomputergeek