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

80
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:~$ 

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

    
задан Pablo 09.03.2012 в 11:44
источник

6 ответов

89

Чтобы убить зомби (процесс), вы должны убить его родительский процесс (точно так же, как настоящие зомби!), но вопрос в том, как его найти.

Найдите зомби (на этот вопрос был дан ответ):

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

То, что вы получаете, это зомби и все остальное с Z в нем, поэтому вы также получите grep:

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:

  • Что такое процессы зомби?
  • Есть ли какие-либо способ убить процесс зомби без перезагрузки?
ответ дан Duncanmoo 03.05.2013 в 10:39
источник
24

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

ps axo pid=,stat=

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

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

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

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

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

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

Теперь вы можете работать с этим списком с помощью простого цикла оболочки

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

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

ответ дан Sorpigal 25.01.2014 в 21:29
3

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

От: Ссылка

Из комментариев улучшенный:

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

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

    
ответ дан Rinzwind 09.03.2012 в 11:48
0

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

ps aux | awk '"[Zz]" ~  { printf("%s, PID = %d\n", , ); }'
    
ответ дан Peycho Dimitrov 04.05.2015 в 17:13
0

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

ps j | awk ' ~ "Z"'

Вам может потребоваться изменить в зависимости от вашей операционной системы.

Это также вернет список их идентификаторов родительского процесса ( PPID ).

Чтобы попытаться убить зомби (после тестирования вышеприведенной команды), попробуйте:

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

Чтобы определить своих родителей, попробуйте pstree , например:

$ ps j | awk 'NR>1 &&  ~ "T" {print }' | 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)
    
ответ дан kenorb 19.02.2016 в 22:12
0

Меньше всего:

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

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

Пользовательский формат, по-видимому, означает: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND , поэтому статус зомби появится в восьмом столбце.

Вы можете указать 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.*
…

Вы могли следить за этим (и он будет определять, нужен ли ваш терминал - Unicode или -A Ascii):

pstree -psS <PID LIST>

ИЛИ, как вы знаете, используйте стрелку вверх в less , чтобы следовать этому дереву / лесу через иерархию; что я рекомендую с помощью подхода «Меньше больше».

    
ответ дан dlamblin 14.02.2018 в 11:40