Як знайти процес зомбі?


100
System information as of Fri Mar  9 19:40:01 KST 2012

  System load:    0.59               Processes:           167
  Usage of /home: 23.0% of 11.00GB   Users logged in:     1
  Swap usage:     0%                 IP address for eth1: 192.168.0.1

  => There is 1 zombie process.

  Graph this data and manage this system at https://landscape.canonical.com/

10 packages can be updated.
4 updates are security updates.

Last login: Fri Mar  9 10:23:48 2012
a@SERVER:~$ ps auxwww | grep 'Z'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
usera     13572  0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
a@SERVER:~$ 

Як знайти той процес зомбі?


чому ви не відкриваєте монітор системи та шукаєте процес зомбі?
длин

8
Як це зробити на безголовому сервері no-X?
SabreWolfy

2
Дивно, що жодна відповідь нижче насправді не говорить про те, що в системі немає жодного процесу зомбі, заснованого на наведеному вище висновку. Якби дійсно був такий, ps auxwww | grep 'Z'команда повинна була показати процес у Zстані. Вислів "Інформація про систему" => There is 1 zombie process.здається помилкою. Або це, або у запитанні відсутня інформація.
аріельф

Відповіді:


126

Щоб вбити зомбі (процес), ви повинні вбити його батьківський процес (як і справжні зомбі!), Але питання полягало у тому, як його знайти.

Знайдіть зомбі (на питання відповіли цю частину):

a@SERVER:~$ ps aux | grep 'Z'

Що ви отримуєте, це зомбі та що-небудь інше із Z в ньому, тож ви також отримаєте гідність:

USER       PID     %CPU %MEM  VSZ    RSS TTY      STAT START   TIME COMMAND
usera      13572   0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
usera      93572   0.0  0.0   0      0   ??       Z    19:40   0:00 something

Знайдіть батьківського зомбі:

a@SERVER:~$ pstree -p -s 93572

Дасть вам:

init(1)---cnid_metad(1311)---cnid_dbd(5145)

У цьому випадку ви не хочете вбивати цей батьківський процес, і вам слід бути дуже задоволеним одним зомбі, але вбивство безпосереднього батьківського процесу 5145 має позбутися цього.

Додаткові ресурси на askubuntu:


1
Результатом, який ви показуєте у своїй відповіді, є сама команда grep, а не процес зомбі. Це те саме неправильне тлумачення, що і Пабло у своїй відповіді. Відповідь Рінцвінда нижче нижче насправді шукає процес зомбі та перераховує їх. Іншим варіантом може бути
греп

pstree -H your_desired_pid -p
Грег М. Крсак

Дякуємо Грегу за те, що додали до дискусії, але, будь ласка, пам’ятайте, що це сайт довідки, просто вставлення команди, не пояснюючи нічого, не корисно для більшості людей, які приходять сюди, шукаючи допомоги.
Данканму

1
Це чудова відповідь! Він діє і сьогодні! Мені вдалося знайти свій процес зомбі і вбити його батьківський процес без проблем. Дякую!
Терранс

1
якщо у вас не встановлено pstree, ps wauxfробить те саме
JDS

35

Хоча це питання давнє, я вважав, що кожен заслуговує на надійнішу відповідь:

ps axo pid=,stat=

Це випромінить два стовпчики з обмеженим пробілом, перший з яких - PID, а другий - його стан.

Я не думаю, що навіть GNU psпропонує спосіб фільтрації за станом безпосередньо, але ви можете надійно це зробитиawk

ps axo pid=,stat= | awk '$2~/^Z/ { print }'

Тепер у вас є список PID, які є зомбі. Оскільки ви знаєте стан, його більше не потрібно відображати, щоб його можна було відфільтрувати.

ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }'

Подання нового обмеженого списку зомбі PID-кодів.

Тепер ви можете оперувати цим списком за допомогою простої петлі оболонки

for pid in $(ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }') ; do
    echo "$pid" # do something interesting here
done

ps це потужний інструмент, і вам не потрібно робити нічого складного, щоб отримати з нього інформацію про процес.

(Значення різних станів процесу тут - https://unix.stackexchange.com/a/18477/121634 )


2
awkце також потужний інструмент, який не просто розбиває текст, але також може відповідати йому. +1 ... інші використовували grepтам, де це непотрібно і неточно.
0xC0000022L

так що тепер у мене є список процесів зомбі. як я їх вбиваю?
chovy

@chovy: Це буде залежати, але, як правило, передбачає вбивство або передачу сигналу батькові. Тут відповідають інші відповіді. Зсередини циклу, показаного вище, ви можете знайти батьківський під так:ps -p "$pid" -opid=,ppid=
Sorpigal

якщо я буду батьком, чи він не вб'є всі його дочірні процеси? Я просто хочу вбити один процес зомбі. Я знаю ппід.
чов

1
Я пропоную додати ppid=до списку параметрів, тому не потрібно використовувати окрему команду для отримання ppid.
Дінг-Іе Чен

3

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

Від: http://www.cyberciti.biz/tips/killing-zombie-process.html

З коментарів покращений:

for p in $(ps jauxww | grep Z | grep -v PID | awk '{print $3}'); do
    for every in $(ps auxw | grep $p | grep cron | awk '{print $2}'); do
        kill -9 $every;
    done;
done;

Але обережно: цей також вбиває процес.


досі нічого не повертає. Я думаю, що мій шлях також не помилився.
Пабло

2-й приклад є пекельно ненадійним, а перший - зайво багатослівним (спробуйте ps axo pid=,stat= | awk '$2~/Z/ {print $1}'замість цього).
Сорпігал

3

Однак менше:

ps afuwwx | less +u -p'^(\S+\s+){7}Z.*'

Це як, дайте мені ліс (дерево) всіх користувачів-процесів у орієнтованому на користувач форматі з необмеженою шириною на будь-якому tty та покажіть мені це на половині екрана вгорі, де він відповідає випадку, коли 8-й стовпець містить Z, і чому б не виділити всю лінію.

Формат, орієнтований на користувача, мабуть, означає: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMANDтак статус зомбі з’явиться у 8-му стовпці.

Ви можете кинути знак Nперед, pякщо хочете номери рядків, а Jякщо ви хочете зірочку на матчі. Сумно, якщо ви Gне виділяєте рядок, що зірочка не відображатиметься, хоча Jстворює простір для неї.

Ви отримуєте щось таке:

…
  root      2919  0.0  0.0  61432  5852 ?      Ss Jan24 0:00 /usr/sbin/sshd -D
  root     12984  0.0  0.1 154796 15708 ?      Ss 20:20 0:00  \_ sshd: lamblin [priv]
  lamblin  13084  0.0  0.0 154796  9764 ?      S  20:20 0:00      \_ sshd: lamblin@pts/0
* lamblin  13086  0.0  0.0  13080  5056 pts/0  Z  20:20 0:00          \_ -bash <defunct>
  lamblin  13085  0.0  0.0  13080  5056 pts/0  Ss 20:20 0:00          \_ -bash
  root     13159  0.0  0.0 111740  6276 pts/0  S  20:20 0:00              \_ su - nilbmal
  nilbmal  13161  0.2  0.0  13156  5004 pts/0  S  20:20 0:00                  \_ -su
  nilbmal  13271  0.0  0.0  28152  3332 pts/0  R+ 20:20 0:00                      \_ ps afuwwx
  nilbmal  13275  0.0  0.0   8404   848 pts/0  S+ 20:20 0:00                      \_ less +u -Jp^(\S+\s+){7}Z.*
…

Ви можете продовжити це (і він виявить, чи подобається вашому терміналу -U Unicode або -A Ascii):

pstree -psS <PID LIST>

АБО просто, знаєте, використовуйте стрілку вгору, lessщоб слідкувати за цим деревом / лісом через ієрархію; що я рекомендував із підходом "Менше - більше".


0

Я пропоную вам цю команду:

ps aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'

Використання auxта вимкнення струн із неї непотрібно, коли ви можете використовувати -oта запитувати саме те, що ви хочете. Використовуйте ps ax -o pid=,stat= | awk '$2 ~ "[Zz]" { printf("%s, PID = %d\n", $2, $1); }'замість цього.
Сорпігал

-1

Щоб переглянути список зомбі, спробуйте виконати цю команду:

ps j | awk '$7 ~ "Z"'

Можливо, вам доведеться змінити, $7залежно від вашої операційної системи.

Це також поверне список ідентифікаторів батьківського процесу ( PPID).

Щоб убити зомбі (після тестування вищевказаної команди), спробуйте:

kill -9 $(ps j | awk 'NR>1 && $7 ~ "Z" {print $2}')

Щоб визначити їх батьків, спробуйте pstree:

$ ps j | awk 'NR>1 && $7 ~ "T" {print $2}' | xargs -L1 pstree -sg
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2430)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2431)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2432)

Звернутися до вилучення одного стовпця з jформату для цього непотрібно. Використовуйте -oдля вибору потрібного.
Сорпігаль

2
ps jне друкує всі процеси в системі. Він містить лише список поточних програм користувача (у стилі завдань BSD), щоб він міг пропустити зомбі.
аріельф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.