2013-06-05 2 views
124

Я запустил свою программу на переднем плане (программа-демон), а затем я убил ее kill -9, но у меня остался зомби, и я не смог его убить kill -9. Как убить зомби-процесс?Как убить процесс зомби

Если зомби - мертвый процесс (уже убит), как я удаляю его с выхода ps aux?

[email protected]:~# anyprogramd & 
[email protected]:~# ps aux | grep anyprogram 
1163 root  2552 S anyprogramd 
1167 root  2552 S anyprogramd 
1169 root  2552 S anyprogramd 
1170 root  2552 S anyprogramd 
10101 root  944 S grep anyprogram 
[email protected]:~# pidof anyprogramd 
1170 1169 1167 1163 
[email protected]:~# kill -9 1170 1169 1167 1163 
[email protected]:~# ps aux |grep anyprogram 
1163 root   0 Z [cwmpd] 
[email protected]:~# kill -9 1163 
[email protected]:~# ps aux |grep anyprogram 
1163 root   0 Z [cwmpd] 
+2

Что говорит 'ps -o ppid 1163'? То есть, кто является родителем 1163 года? Это процесс, который должен быть прекращен. –

ответ

169

Зомби уже мертвы, поэтому вы не можете его убить. Чтобы очистить зомби, его нужно ждать от его родителя, поэтому убийство родителя должно работать, чтобы уничтожить зомби. (После того, как родитель умирает, зомби будет унаследован init, который будет ждать его и очистит его запись в таблице процессов.) Если ваш демона порождает детей, которые становятся зомби, у вас есть ошибка. Ваш демона должен заметить, когда его дети умирают, и wait на них, чтобы определить их статус выхода.

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

kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}') 
+1

Если зомби мертвый процесс (уже убит), как я его удаляю из вывода 'ps aux'? – MOHAMED

+113

Зомби нужно ждать от его родителя. Найдите своего родителя и выясните, почему этот родитель не обращает внимания на своих детей, а затем подает жалобу в социальные службы. ;) –

+26

_ Если ваш демон порождает детей, которые становятся зомби_, вполне сатанинские! (Преднамеренное орфографическое письмо намеренно) – Shahbaz

25

Я пробовал:

ps aux | grep -w Z # returns the zombies pid 
ps o ppid {returned pid from previous command} # returns the parent 
kill -1 {the parent id from previous command} 

это будет работать :)

+4

Не работал для меня. –

+0

В моем случае зомби создавал скрипт запуска и программу, которая не была явно удалена, поэтому я очистил ее. –

+1

Работал для меня. Это будет работать в некоторых случаях, когда несуществующий процесс был порожден пытливым процессом. –

59

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

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }') 
+0

Это сработало для меня. Это в основном то же самое, что и решение Мохаммада Рафи, но представлено в одной простой строке. –

+3

Эта команда очищает зомби от таблицы процессов, но не убивает зомби. Зомби уже мертв. –

+5

'grep' не требуется. 'ps ... | awk '/ [zZ]/{print $ 2}' ' –

14

Я попытался

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }') 

и это работает для меня.

18

Нашел в http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/

2) Здесь большой наконечник от другого пользователя (Thxs Bill Dandreta): Иногда

kill -9 <pid> 

не будет убивать процесс. Запуск

ps -xal 

4-я поле является родительским процесс, убить все родитель зомби и зомби умирает!

Пример

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat 
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr 
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie 

18581, 18582, 18583 зомби -

kill -9 18581 18582 18583 

не имеет никакого эффекта.

kill -9 31706 

удаляет зомби.

+1

хорошо, что просто убил 'init' для меня, и теперь я ничего не могу сделать, и я вынужден перезапустить ... зомби-процесс - это Java, взяв 3,4 ГБ из 4 ГБ ОЗУ – Tcll