it-swarm-ru.tech

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

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

38
jldugger

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

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

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

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

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

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

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

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

17
Severe_admin

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

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

20
vartec

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

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

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

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

10
nedm

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

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

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

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

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

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

8
Xerxes

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

 $ shoot <pid> 
 #!/bin/sh 
 жертва = `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" Killed $ {жертва_имя}. "

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

0
drybjed