Зомби-процессы, страшно, да ... Или нет? Вот краткое изложение того, что я узнал за последнюю неделю, пытаясь разместить сервер Linux в рамках моего проекта Валидатор страхового налога.

Что такое зомби-процесс? 🧟‍♂️

Зомби-процесс возникает, когда родитель не пожинает своего ребенка.

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

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

Зомби-процессы не следует путать с сиротскими процессами: сиротский процесс - это процесс, который все еще выполняется, но родитель которого умер. Когда родитель умирает, осиротевший дочерний процесс принимается init (идентификатор процесса). Когда процессы-сироты умирают, они не остаются как процессы-зомби; вместо этого они wait включены init. В результате процесс, который одновременно является зомби и сиротой, будет завершен автоматически.

Зомби-поток - это присоединяемый поток, который завершился, но не присоединился.

Как правило, нить нужно либо соединить, либо отсоединить. В противном случае ОС сохраняет свое состояние для некоторого возможного будущего соединения, которое требует ресурсов.

Опасности зомби-процессов ⚠️

Зомби-процессы не потребляют никаких системных ресурсов. (На самом деле каждый из них использует очень крошечный объем системной памяти для хранения своего дескриптора процесса.) Однако каждый зомби-процесс сохраняет свой идентификатор процесса (PID). Системы Linux имеют ограниченное количество идентификаторов процессов - 32767 по умолчанию в 32-битных системах. Если зомби накапливаются с большой скоростью - например, если неправильно запрограммированное серверное программное обеспечение создает зомби-процессы под нагрузкой, - весь пул доступных PID в конечном итоге будет назначен процессам-зомби, предотвращая запуск других процессов. Однако наличие нескольких зомби-процессов не является проблемой - хотя они указывают на ошибку в родительском процессе в вашей системе.

Как убить зомби-процессы? ⚔

Обычно мы убиваем процессы с помощью команды SIGKILL, но зомби-процессы уже мертвы. Вы не можете убить что-то уже мертвое.

Представьте себе это так:

«Вы находите труп посреди дороги, звоните семье трупа, и они уносят его с дороги».

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

Как найти процесс Зомби? 🤷‍♀️

a@SERVER:~$     ps aux | grep 'Z'

Вы получите зомби и все остальное с буквой Z, так что вы также получите команду grep:

USER       PID     %CPU %MEM  VSZ    RSS TTY      STAT START   TIME 
usera      13572   0.0  0.0   7628   992 pts/2    S+   19:40   0:00 
usera      93572   0.0  0.0   0      0   ??       Z    19:40   0:00

Как найти родителя Зомби? 🤷‍♂️

a@SERVER:~$      pstree -p -s 93572

Даст тебе:

init(1)---cnid_metad(1311)---cnid_dbd(5145)

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

Стоит ли бояться? 😧

Ну и да, и нет.

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

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

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

Все еще беспокоитесь о зомби-процессе? Oracle здесь, чтобы помочь. Благодаря непревзойденным ценам на облачные услуги у вас есть возможность опробовать их виртуальные машины Linux, для которых гарантировано автоматическое выполнение зомби-процессов.

Следуйте, чтобы получить бесплатную 30-дневную пробную версию с услугами Oracle Cloud.

Спасибо, что нашли время прочитать мою статью. Если вы ищете больше подобных сообщений, вы можете найти меня в Linkedin, Twitter или Medium.

* Все представления принадлежат мне, а не Oracle **