Что такое «процесс зомби» в Linux?
Если вы пользователь Linux, вы, возможно, видели процессы зомби, шатающиеся по списку процессов. Вы не можете убить процесс зомби, потому что он уже мертв - как настоящий зомби.
Зомби - это остатки мертвых процессов, которые не были очищены должным образом. Программа, которая создает процессы зомби, не запрограммирована должным образом - программы не должны позволять процессам зомби оставаться на месте.
Изображение предоставлено: Дэниел Холлистер на Flickr (Remixed)
Что такое процесс зомби?
Чтобы понять, что такое зомби-процесс и что вызывает появление зомби-процессов, вам необходимо немного понять, как эти процессы работают в Linux..
Когда процесс умирает в Linux, он не все сразу удаляется из памяти - его дескриптор процесса остается в памяти (дескриптор процесса занимает только небольшое количество памяти). Статус процесса становится EXIT_ZOMBIE, и родительский процесс уведомляется о том, что его дочерний процесс умер с сигналом SIGCHLD. Затем предполагается, что родительский процесс выполняет системный вызов wait (), чтобы прочитать состояние завершения мертвого процесса и другую информацию. Это позволяет родительскому процессу получать информацию из мертвого процесса. После вызова wait () процесс зомби полностью удаляется из памяти.
Обычно это происходит очень быстро, поэтому вы не увидите, как зомби-процессы накапливаются в вашей системе. Однако, если родительский процесс не запрограммирован должным образом и никогда не вызывает wait (), его дочерние элементы-зомби останутся в памяти, пока не будут очищены..
Утилиты, такие как системный монитор GNOME, Топ команда и п.с. команда отображения процессов зомби.
Опасности зомби-процессов
Зомби-процессы не используют системные ресурсы. (На самом деле каждый из них использует очень маленький объем системной памяти для хранения дескриптора процесса.) Однако каждый процесс-зомби сохраняет свой идентификатор процесса (PID). Системы Linux имеют конечное число идентификаторов процессов - 32767 по умолчанию в 32-разрядных системах. Если зомби накапливаются с очень высокой скоростью - например, если неправильно запрограммированное серверное программное обеспечение создает процессы зомби под нагрузкой - весь пул доступных PID в конечном итоге будет назначен процессам зомби, предотвращая запуск других процессов.
Тем не менее, некоторые процессы, связанные с зомби, не являются проблемой - хотя они указывают на ошибку с родительским процессом в вашей системе.
Избавляемся от зомби-процессов
Вы не можете убить процессы зомби, как вы можете убить нормальные процессы с помощью сигнала SIGKILL - процессы зомби уже мертвы. Имейте в виду, что вам не нужно избавляться от зомби-процессов, если у вас нет большого количества в вашей системе - несколько зомби безвредны. Однако есть несколько способов избавиться от зомби-процессов..
Одним из способов является отправка сигнала SIGCHLD родительскому процессу. Этот сигнал говорит родительскому процессу выполнить системный вызов wait () и очистить его дочерних элементов-зомби. Отправить сигнал с убийство команда, заменяющая ПИД-регулятор в приведенной ниже команде с PID родительского процесса:
убить -s SIGCHLD PID
Однако, если родительский процесс не запрограммирован должным образом и игнорирует сигналы SIGCHLD, это не поможет. Вам придется убить или закрыть родительский процесс зомби. Когда процесс, который создал зомби, заканчивается, init наследует процессы зомби и становится их новым родителем. (init является первым процессом, запущенным в Linux при загрузке, и ему назначается PID 1.) init периодически выполняет системный вызов wait (), чтобы очистить своих дочерних элементов-зомби, поэтому init будет выполнять короткую работу с зомби. Вы можете перезапустить родительский процесс после его закрытия.
Если родительский процесс продолжает создавать зомби, его следует исправить, чтобы он правильно вызывал wait (), чтобы пожинать своих потомков-зомби. Подайте отчет об ошибке, если программа в вашей системе продолжает создавать зомби.