Назад | Перейти на главную страницу

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

Виртуальные дробовики?

Зомби-процесс (собственно сейчас они называются <defunct>) на самом деле не является процессом. Это только запись в таблице процессов, поэтому родительский процесс может wait() системный вызов.

Не беспокойтесь о них. Они не занимают никаких ресурсов, они исчезнут, когда их родитель вызовет wait() когда умирает сам родитель.

О Боже! Нет нет нет. Не используйте kill -9.

Это не дает процессу чисто:

  1. отключение сокетных соединений

  2. очистить временные файлы

  3. сообщить своим детям, что он уходит

  4. сбросить его характеристики терминала и так далее, и так далее и так далее.

Как правило, отправьте 15 и подождите секунду или две, и если это не сработает, отправьте 2, а если это не сработает, отправьте 1. Если это не так, УДАЛИТЕ Двоичный файл, потому что программа плохо себя ведет!

Не используйте kill -9. Не вынимайте комбайн только для того, чтобы привести в порядок цветочный горшок.

Однако уже есть принятый ответ: вы МОЖЕТЕ убить процесс зомби. Присоединитесь с отладчиком к родительскому процессу и вызовите функцию waitpid. Например: - предположим, что у родителя PID = 100, у процесса зомби PID = 200

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit

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

Вот некоторые совет по избавлению от них.

У процесса-зомби нет выделенных ему ресурсов, кроме записи в дереве процессов. Это происходит, когда процесс завершается, но родительский процесс еще не пожала это, (т.е. waitред на нем).

Вы можете попытаться заставить родителя сделать это, если хотите, отправив ему SIGCHLD (kill -20) родителю, но нет гарантии, что родитель его выполнит.

Вы часто будете видеть их в течение коротких периодов времени (например, просматривая дерево процессов с помощью top) - это нормально; Во временном интервале между завершением дочернего процесса и его опросом родительский процесс будет отображаться как зомби.

Однако если вы видите постоянно существующие зомби-процессы - что ненормально - все равно не о чем беспокоиться - опять же, поскольку мертвому процессу не выделен ресурс - это обычно означает, что приложение плохо написано дрянными разработчиками.

Единственный раз, когда вас должны беспокоить зомби-процессы, - это когда вы видите много-много из них, например, если то же самое дерьмовое приложение, упомянутое выше, помещено под нагрузку.

У нас есть много дрянных разработчиков, где я работаю, и поэтому я имею честь заниматься такими проблемами и изучать при этом всевозможные бесполезные вещи. На самом деле - моя команда часто прибегает к использованию дрянных сценариев оболочки, написанных нашими дрянными разработчиками на собеседованиях - если кандидат может выбрать, что сценарий действительно дрянный, и рассказать нам, почему он дрянный, у него хорошая нога в дверь.

Что касается виртуального дробовика ...

$ shoot <pid>
#!/bin/sh
victim=`ps -e -o pid,ppid | egrep "^\s*$1\b" | awk '{print $2}'`
victim\_name=`ps -e -o pid,cmd | egrep "^\s*${victim}\b" | head -n 1 | awk '{print $2}'`
#kill ${victim}
echo "Killed ${victim_name}."

И помните: всегда стреляйте им в голову.

Процесс-зомби - это процесс, выполнение которого завершилось, но все еще отображается в таблице процессов.

kill -9 [имя родительского процесса] подавит это с крайним предубеждением.