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


Ответы:


17

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

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

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

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

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

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

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

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


13
убить -9 не убьет зомби. Вы должны убить их родителей, посмотрите на pstree.
LapTop006

3
@ LapTop006: В этом случае они больше похожи на вампиров; убить голову вампира, чтобы остановить вторжение.
амфетамина

2
Этот ответ неверен почти во всех отношениях. Процесс завершен; он уже закрыл свои соединения, очистил временные файлы и т. д. и т. д. Фактически процесс больше не существует, только запись в таблице процессов. Не удаляйте дочерний двоичный файл - он не ведет себя плохо. Это просто означает, что родитель еще не провел надлежащие похороны для своего ребенка.
Кен Уильямс

19

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

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



9

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

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

Интересный. Я попробую это.
2010 года

8

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

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

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

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

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

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


0

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

$ 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 "Убил $ {жертва_имя}."

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


Извините, но, к сведению, этот скрипт имеет опечатку «имя_ жертвы» и собирается убить родителя идентификатора PID, указанного на $ 1, в любом случае учитывает, является ли PID единственным зомби или если у него есть братья и сестры, он просто убивает отца и вместе с ним погибает вся семья.
Марк Риера

-1

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

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


kill -9 не убьет процесс зомби - это одна из причин, по которой их называют зомби. «Процесс» зомби не исчезнет, ​​пока его код возврата не будет получен родительским процессом.
Мэй

3
Нет, kill -9 на PARENT убьет родителя, сделав init родителем, что будет пожинать код возврата ребенка.
Алан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.