it-swarm.com.ru

Как убить зомби-процесс

Я запустил свою программу на переднем плане (программа-демон), а затем убил ее с помощью 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]
157
MOHAMED

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

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

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

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

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

Я старался:

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}

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

31
Mohammad Rafiee

Нашел по адресу 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

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

23
Sergio

Я старался

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

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

19
Jeoffrey