Можливо побачити мертві процеси?


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% неможливо?


2
Використання слід та той факт, що це знаходиться на сторінці людини, означає, що насправді це можливо побачити. Я поняття не маю, як і коли.
terdon

Відповіді:


7

Я трохи занурився в ядро ​​Linux, не знаючи про те, як воно працює у його внутрішньому ядрі, або про якісь великі знання C. Тож будьте приємні з цією теорією :)

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 як стан можна розглядати теоретично, але, ймовірно, ніколи не був у реальному житті ..

Будь ласка, виправте мене, якщо / де я помиляюся .. Я взагалі не впевнений у цьому ..


2
Я бачу це зuntil sleep 0.4 & perl -e '$p = shift; while (1) {open A, "</proc/$p/stat" or last; $_=<A>; print}' $! | grep X; do :; done
Стефан Шазелас

Ось як виглядає процес (вихід /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.. На питання відповів. X можливо! Дякую!
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]

Ви пам’ятаєте, чи пройшов процес наступного разу, коли ви побігли ps?
Hitechcomputergeek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.