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

Запустите эту команду в окне терминала:

sudo apt-get remove `apt-cache depends gnome-core|cut -f 2 -d :|xargs`
1
задан 15 April 2018 в 16:41

5 ответов

Несмотря на то, что этот вопрос старый, я думал, что каждый заслуживает более надежного ответа:

ps axo pid=,stat=

Это испустит два столбца с разделителями пробелов, первый из которых является PID, а второй из них его состояние.

Я не думаю, что даже GNU ps обеспечивает способ фильтрации по состоянию напрямую, но вы можете надежно сделать это с помощью awk

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

You теперь список PID, которые являются зомби.

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

Предоставление списка идентификаторов Zombie с разделителями строк.

Теперь вы можете указать, что состояние больше не нужно отображать, поэтому его можно отфильтровать.

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

работать с этим списком с помощью простого цикла оболочки

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

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

26
ответ дан 25 May 2018 в 13:37
  • 1
    awk также является мощным инструментом, который не просто разделяет текст, но также может соответствовать ему. +1 ... другие использовали grep, где это не нужно и неточно. – 0xC0000022L 26 May 2014 в 17:28
  • 2
    так что теперь, когда у меня есть список процессов зомби. как я их убиваю? – chovy 21 December 2015 в 08:58
  • 3
    @chovy: Это будет зависеть, но обычно включает в себя убийство или сигнализацию родителя. Здесь приводятся другие ответы. Из приведенного выше цикла вы можете найти родительский pid следующим образом: ps -p "$pid" -opid=,ppid= – Sorpigal 22 December 2015 в 18:50
  • 4
    если я родитель не будет убивать все его дочерние процессы? Я просто хочу убить один зомбический процесс. Я знаю пипса. – chovy 23 December 2015 в 05:32
  • 5
    @chovy: Команда, которую вы хотите, - kill -CHLD "$ppid", но даже этого может быть недостаточно, прочитайте весь этот пост , чтобы понять, каковы ваши варианты. – Sorpigal 30 December 2015 в 22:49

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;

Осторожно: этот тоже убивает процессы.

4
ответ дан 25 May 2018 в 13:37
  • 1
    все равно ничего не возвращает. Я думаю, что мой путь тоже был неправ. – Pablo 9 March 2012 в 16:51

Меньше, хотя:

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 следовать за этим деревом / лесом через иерархию; что я рекомендовал с помощью подхода «Меньше больше».

1
ответ дан 25 May 2018 в 13:37

Я предлагаю вам эту команду:

ps aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'
0
ответ дан 25 May 2018 в 13:37
  • 1
    Использование aux и строк перебора из него бесполезно ненадежны, когда вы можете использовать -o и запросить именно то, что вы хотите. Вместо этого используйте ps ax -o pid=,stat= | awk '$2 ~ "[Zz]" { printf("%s, PID = %d\n", $2, $1); }'. – Sorpigal 24 February 2018 в 00:16

Чтобы просмотреть процесс зомби, попробуйте выполнить эту команду:

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)
0
ответ дан 25 May 2018 в 13:37
  • 1
    Прибегнуть к снятию одного столбца из формата j для этого излишне сложно. Используйте -o, чтобы выбрать то, что вы хотите. – Sorpigal 24 February 2018 в 00:09

Другие вопросы по тегам:

Похожие вопросы: