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

140

Я запустил свою программу на переднем плане (программа-демон), а затем я убил ее с помощью 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]
  • 2
    Что говорит ps -o ppid 1163 ? То есть кто является родителем 1163? Это процесс, который должен быть прекращен.
Теги:
debian
zombie-process

5 ответов

188
Лучший ответ

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

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

kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
  • 1
    Если зомби - мертвый процесс (уже убитый), как я могу удалить его из вывода ps aux ?
  • 145
    Зомби должен ждать его родитель. Найдите своего родителя и выясните, почему этот родитель не обращает внимания на своих детей, затем подайте жалобу в социальные службы. ;)
Показать ещё 3 комментария
61

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

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
  • 0
    Это сработало для меня. Это в основном то же самое, что и решение Мухаммеда Рафи, но представлено в одной простой строке.
  • 5
    Эта команда очищает зомби от таблицы процессов, но она не «убивает» зомби. Зомби уже мертв.
Показать ещё 6 комментариев
29

Я пробовал:

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}

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

  • 6
    Не работал для меня
  • 0
    В моем случае зомби создавался с помощью сценария запуска и программы, которая не была четко удалена, поэтому я очистил ее.
Показать ещё 2 комментария
18

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

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

kill -9 <pid>

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

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

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

  • 2
    хорошо, что только что убил init для меня, и теперь я ничего не могу сделать и вынужден перезапустить ... процесс зомби - это Java, занимающий 3,4 ГБ из 4 ГБ ОЗУ
17

Я пробовал

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

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

Сообщество Overcoder
Наверх
Меню