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

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

7 ответов

Решение

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

Это не дает процессу возможность чисто:

  1. отключить сокет соединения

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

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

  4. сбросить свои терминальные характеристики и тд и тд и тп.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

$ shoot 
#! / Bin/ ш
жертва =`ps -e -o pid,ppid | egrep "^\s*$1\b" | awk '{print $2}'`
жертва \_name=`ps -e -o pid,cmd | egrep "^\s*${жертва} \ b" | голова -n 1 | awk '{print $2}'`
#kill ${жертва}
echo "Убил $ {жертва_имя}."

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

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

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

Другие вопросы по тегам