Ответы:
О Боже! Нет нет нет. Не используйте kill -9.
Это не дает процессу возможность чисто:
отключить сокет соединения
очистить временные файлы
сообщить своим детям, что он уходит
сбросить свои терминальные характеристики и тд и тд и тп.
Как правило, отправьте 15 и подождите секунду или две, и если это не сработает, отправьте 2, а если это не сработает, отправьте 1. Если это не сработает, УДАЛИТЕ ДВОЙНОЙ, потому что программа плохо себя ведет!
Не используйте kill -9. Не берите комбайн только для того, чтобы привести в порядок цветочный горшок.
Процесс зомби (на самом деле теперь они называются <defunct>
) на самом деле не процесс. Это только запись в таблице процессов, поэтому родительский процесс может выполнять wait()
syscall .
Вы не должны беспокоиться о них. Они не занимают никаких ресурсов, они исчезнут либо при вызове их родителя, wait()
когда сам родитель умирает.
Однако уже принят принятый ответ: вы МОЖЕТЕ убить процесс зомби. Присоедините с помощью отладчика к родительскому процессу и вызовите функцию waitpid. Например: - давайте предположим, что родитель имеет PID = 100, процесс зомби имеет PID = 200
$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
У процесса зомби нет выделенных ему ресурсов, кроме записи в дереве процессов. Это происходит, когда процесс завершается, однако родительский процесс еще не получил его (т. Е. Редактировалwait
его).
Вы можете попытаться заставить родителя сделать это, если хотите, отправив ему kill -20
родительский объект SIGCHLD ( ), но нет гарантии, что родитель выполнит его.
Вы будете часто видеть их в течение коротких периодов времени (например, при просмотре дерева процессов с помощью top) - это нормально; В промежутке времени между завершением дочернего процесса и опросом родительского процесса дочерний процесс будет отображаться как зомби.
Однако, если вы видите процессы зомби, которые постоянно существуют - что не является нормальным - это все равно не нужно беспокоить - опять же, поскольку нет ресурсов, выделенных для мертвого процесса - это обычно означает, что приложение плохо написано дрянными разработчиками.
Единственный случай, когда вас должны волновать процессы зомби, - это когда вы видите их очень много, например, если то же самое дрянное приложение, упомянутое выше, загружено.
У меня есть много дурацких разработчиков, где я работаю, и поэтому у меня есть привилегия иметь дело с такими проблемами и изучать все виды бесполезных вещей при этом. Фактически - моя команда часто прибегает к использованию дрянных сценариев оболочки, написанных дрянными разработчиками в интервью, - если кандидат может понять, что сценарий действительно дурацкий, и сказать нам, почему он дерьмовый, у него хорошая ножка в дверь.
Что касается виртуального дробовика ...
$ shoot <pid>
#! / 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 [родительское имя_процесса] откажется от него с предубеждением.