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


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

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

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# 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
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [cwmpd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [cwmpd]
5 134

5 ответов:

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

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

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

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

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

пробовал:

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}

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

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

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

пробовал

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

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