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:~$
Как найти этот процесс зомби?
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;
Осторожно, хотя: этот также убивает процесс.
Чтобы убить зомби (процесс), вы должны убить его родительский процесс (как настоящие зомби!), Но вопрос был в том, как его найти.
Найдите зомби (Вопрос ответил на эту часть):
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:
Несмотря на то, что этот вопрос старый, я думал, что каждый заслуживает более надежного ответа:
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
- мощный инструмент, и вам не нужно делать ничего сложного, чтобы извлечь из него информацию о процессе.
Я предлагаю вам эту команду:
ps aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'
Меньше значит больше, хотя:
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
, чтобы следовать этому дереву / лесу через иерархию; это то, что я рекомендовал с подходом «Меньше значит больше».
Чтобы вывести список зомби процессов, попробуйте следующую команду:
ps j | awk '$7 ~ "Z"'
Вам может потребоваться изменить $7
в зависимости от операционной системы. Sup>
Это также вернет список идентификаторов своих родительских процессов (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)