Запустите эту команду в окне терминала:
sudo apt-get remove `apt-cache depends gnome-core|cut -f 2 -d :|xargs`
Несмотря на то, что этот вопрос старый, я думал, что каждый заслуживает более надежного ответа:
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 является мощным инструментом, и вам не нужно ничего делать, чтобы получить информацию о процессе из него.
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;
Осторожно: этот тоже убивает процессы.
Меньше, хотя:
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 aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'
Чтобы просмотреть процесс зомби, попробуйте выполнить эту команду:
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)