Что такое процесс зомби и как мне его убить?
Виртуальные дробовики?
7 ответов
О Боже! Нет нет нет. Не используйте kill -9.
Это не дает процессу возможность чисто:
отключить сокет соединения
очистить временные файлы
сообщить своим детям, что он уходит
сбросить свои терминальные характеристики и тд и тд и тп.
Как правило, отправьте 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 [родительское имя_процесса] откажется от него с предубеждением.