Что такое зомби-процессы?


138

С помощью команд вроде topи на основе графического интерфейса System Monitorя вижу, что на данный момент у меня есть несколько процессов зомби.

Что такое зомби-процессы?

Влияют ли они на производительность системы или приложения, к которому они относятся? Они используют слишком много памяти или вообще никакой памяти?


39
Это процессы, которые хотят съесть ваш процессор;)
Луис Альварадо

8
на обед ... :)
RolandiXor

3
Эти процессы мертвы, но не похоронены.
Prateek Joshi

2
Ешь мой процессор ?! Это действительно ужасно!
Håvard Geithus

Ответы:


162

Зомби - это МЕРТВЫЕ процессы. Их нельзя «убить» (вы не можете убить МЕРТВУ). Все процессы в конечном итоге умирают, и когда они это делают, они становятся зомби. Они почти не потребляют ресурсов, чего и следовало ожидать, потому что они мертвы! Причиной для зомби является то, что родитель (процесс) зомби может получить информацию о состоянии выхода из зомби и статистику использования ресурсов. Родитель сообщает операционной системе, что зомби больше не нужен, используя один из системных вызовов wait ().

Когда процесс умирает, все его дочерние процессы становятся дочерними для процесса номер 1, который является процессом init. Init - это «всегда», ожидая смерти детей, чтобы они не оставались зомби.

Если у вас есть процессы зомби, это означает, что их родители не ожидали этих зомби (посмотрите на отображаемый PPID ps -l). У вас есть три варианта: исправить родительский процесс (заставить его ждать); убить родителя; или жить с этим. Помните, что жить с ним не так сложно, потому что зомби занимают чуть больше одной дополнительной строки в выводе ps.

Зомби можно идентифицировать в выходных данных команды Unix ps по наличию «Z» в столбце STAT. Зомби, которые существуют в течение более короткого периода времени, обычно указывают на ошибку в родительской программе. Как и в случае других утечек, присутствие нескольких зомби само по себе не вызывает беспокойства, но может указывать на проблему, которая может стать серьезной при более высоких нагрузках.

Чтобы удалить зомби из системы, сигнал SIGCHLD можно отправить родителю вручную, используя команду kill. Если родительский процесс по-прежнему отказывается пожинать зомби, следующим шагом будет удаление родительского процесса. Когда процесс теряет своего родителя, init становится его новым родителем. Init периодически выполняет системный вызов wait, чтобы пожинать зомби с init в качестве родителя.

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

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

Сироты тратят впустую ресурсы сервера и потенциально могут оставить сервер в беде (Это самая большая разница в ресурсах между зомби и сиротами (за исключением случаев, когда вы видите какой-нибудь фильм о зомби-сиротах). Однако есть несколько способов решения проблемы процесса-сироты

  1. Истребление является наиболее часто используемой техникой; в этом случае сиротский процесс убит.

  2. Реинкарнация - это техника, при которой машины периодически пытаются найти родителей любых удаленных вычислений; в этот момент осиротевшие процессы убиты.

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

Процесс также может быть потерян, если он запущен на том же компьютере, что и его родительский процесс. В UNIX-подобной операционной системе любой потерянный процесс будет немедленно принят специальным системным процессом init. Эта операция называется переопределением и происходит автоматически. Хотя технически процесс имеет процесс init в качестве своего родителя, он все еще называется процессом-сиротой, так как процесс, который первоначально его создал, больше не существует.

Больше информации:

http://wiki.answers.com/Q/What_is_Zombie_Process_and_Orphan_Process#ixzz1PCN9vojU

http://www.linuxsa.org.au/tips/zombies.html

http://www.brighthub.com/computing/linux/articles/79186.aspx

Как определить и остановить процесс зависания, когда система зависает и медленно реагирует на ввод пользователя?

Уничтожение запущенного процесса на машине с Ubuntu удаленно с машины с Windows, которая находится в локальной сети


18
Ekhm! Вы МОЖЕТЕ убить мертвых! Вы просто должны стремиться к голове. Или они лгали нам все время?
Марцин Камински

1
initпризывает waitвсе его дочерние процессы, будь то зомби, осиротевшие (усыновленные) и биологические (порожденные собой)?
Кровоточащие пальцы

1
соотв. к мировой войне Z используйте камуфляж: P
عثمان غني

Пожалуйста, дайте медаль @MarcinKaminski!
Андреа

20

Процессы зомби (также показанные как <defunct>), вообще не являются реальными процессами. Это просто записи в таблице процессов ядра. Это единственный ресурс, который они потребляют. Они не потребляют ни CPU, ни RAM. Единственная опасность наличия зомби - это нехватка места в таблице процессов (вы можете использовать, cat /proc/sys/kernel/threads-maxчтобы узнать, сколько записей разрешено в вашей системе).

Они появляются только тогда, когда их родительский процесс (то есть процесс, который fork()'edони) жив, но еще не вызвал wait()системную функцию. После того, как родитель умирает, зомби wait()'edза помощью initи исчезают.


4
top`Скриншот в этом вопросе , кажется, противоречит вам? Там, кажется, зомби использует 100% 1 процессора, но не памяти.
Торбен Гундтофте-Брюн

7

Когда child processзавершается, его смерть сообщается его родителю, чтобы родитель мог предпринять какое-то соответствующее действие.

A process, ожидающий своего родителя, чтобы принять его код возврата, называется процессом зомби .

У них есть, completed their executionно все еще есть entryв process table.


1

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

Долгоживущие процессы зомби происходят, когда родительские процессы не вызывают системный вызов wait после завершения дочернего процесса. Одна из ситуаций, когда это происходит, - когда родительский процесс плохо написан и просто пропускает вызов ожидания, или когда родительский процесс умирает до того, как дочерний процесс и новый родительский процесс не вызывает ожидание для него. Когда родительский процесс умирает раньше дочернего, ОС назначает дочерний процесс процессу «init» или PID 1. То есть процесс init «принимает» дочерний процесс и становится его родителем. Это означает, что теперь, когда дочерний процесс завершает работу, новый родительский элемент (init) должен вызвать wait, чтобы получить свой код выхода, или его запись в таблице процессов останется навсегда, и он станет зомби.

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