Процесс называется “зомби” или “мертвым” процессом, когда его выполнение завершено, но он все еще может попасть в таблицу процессов.
В идеале такие процессы должны быть удалены из таблицы процессов после завершения их выполнения.
Однако по какой-то причине родительский процесс не удалил его должным образом.
Такие “неработающие” процессы наблюдаются в основном у дочерних процессов.
Как сохранить процессы, запущенные после выхода SSH в Linux
Родительский процесс считывает статус завершения своего дочернего процесса.
Это делается с помощью системного вызова wait().
Как только это сделано, зомби-процесс ликвидируется.
Чтобы лучше понять процесс образования и устранения зомби-процесса, посмотрите приведенную ниже схему.
Как работает состояние зомби-процесса
Итак, как работает состояние зомби-процесса?
В состоянии зомби-процесса родитель вызывает одну функцию wait() во время создания дочернего процесса.
Затем он ждет изменения состояния дочернего процесса.
В случае изменения состояния, при котором дочерний процесс остановился, считывается его код состояния завершения.
После этого PCB (process control block) дочернего процесса уничтожается, а запись очищается.
Это происходит очень быстро, и зомби-процесс существует недолго.
Интересные факты о зомби-процессах
Некоторые интересные факты о зомби-процессах включают:
Вся системная память и другие ресурсы, выделенные зомби-процессу, деаллокируются при его завершении с помощью системного вызова exit().
Но его запись в таблице остается доступной.
Если родительский процесс не запущен, наличие зомби-процесса означает ошибку в операционной системе.
Это может не вызывать серьезных проблем, если зомби-процессов немного.
Но при больших нагрузках присутствие зомби-процессов может привести к нехватке записей в таблице процессов.
Мы рассмотрим опасность зомби-процессов в следующем разделе этой статьи.
Родительский процесс считывает статус завершения зомби-процесса с помощью функции wait().
Затем зомби-процесс удаляется из системы.
После его удаления запись в таблице процессов и идентификатор процесса могут быть использованы повторно.
Если функция wait() не используется родительским процессом, зомби остается в таблице процессов.
Это создает утечку ресурсов.
Послав сигнал SIGCHLD родительскому процессу с помощью команды kill, вы можете удалить зомби-процесс из системы.
Если зомби-процесс остается в таблице процессов даже после отправки сигнала SIGCHLD, родительский процесс должен быть завершен, если это допустимо.
Опасны ли зомби-процессы?
Зомби-процессы используют немного памяти, но обычно они не представляют опасности.
Запись в таблице процессов небольшая, но вы не можете использовать идентификатор процесса, пока зомби-процесс не будет освобожден.
На 64-разрядной ОС это не создаст проблемы, потому что PCB больше, чем запись таблицы процессов.
Огромное количество зомби-процессов может повлиять на свободную память, доступную для других процессов.
Если вы столкнулись со слишком большим количеством зомби-процессов, значит, существует какая-то серьезная проблема с ошибкой операционной системы или родительского приложения.
В этом случае оставшиеся идентификаторы процессов монополизируются зомби.
Если не остается ни одного идентификатора процесса, другие процессы не могут быть запущены.
Как найти и убить зомби-процессы
Чтобы убить зомби-процесс, сначала найдите его.
Используйте приведенные ниже команды для выявления зомби-процессов.
$ ps aux | egrep "Z|defunct"
Z, используемый в колонке STAT, и/или [defunct], используемый в последней колонке вывода, идентифицирует зомби-процесс.
На самом деле, вы не можете убить зомби-процессы, так как они уже мертвы.
Все, что вы можете сделать, это уведомить его родительский процесс, чтобы он мог снова попытаться прочитать статус дочернего процесса, который теперь стал зомби-процессом, и, в конце концов, мертвый процесс будет удален из таблицы процессов.
Используйте следующую команду, чтобы узнать ID родительского процесса.
$ ps -o ppid= <PID дочернего процесса>.
Как только вы узнаете ID родительского процесса зомби, отправьте SIGCHLD родительскому процессу.
$ kill -s SIGCHLD <Родительский PID>.
Если это не помогло удалить зомби-процесс из таблицы процессов, вам нужно перезапустить или убить его родительский процесс.
Чтобы убить родительский процесс зомби, используйте следующий код.
$ kill -9 <Родительский PID>
Побочное замечание: После того как вы убьете родительский процесс, пострадают и его дочерние процессы. Поэтому рекомендуется провести быструю двойную проверку.
Это поможет вам обезопасить себя.
Если наблюдается огромный всплеск существующих зомби-процессов, что приводит к сбою в работе системы или движется к нему, необходимо выполнить перезагрузку системы.
В качестве альтернативы можно предположить, что небольшое количество зомби-процессов не использует много памяти или системных ресурсов.
В этом случае целесообразно перезагрузить или убить родительский процесс в ходе предстоящего планового обслуживания системы.
Заключение
В этой статье вы узнали, как найти и убить зомби-процессы Linux.
Теперь вы знаете, что такое зомби-процесс, как определить зомби-процесс в Linux и удалить его из таблицы процессов.
Мы также вкратце рассмотрели состояния процессов и то, как работает состояние зомби-процесса.
Итак, вывод: зомби не опасны, если их своевременно чистить и обслуживать.
Надеемся, что эта статья оказалась полезной и дала ответы на ваши вопросы, связанные с зомби-процессами в Linux.