🧟 Как найти и убить зомби-процессы в системах Linux |

🧟 Как найти и убить зомби-процессы в системах Linux

Мануал

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

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

Однако по какой-то причине родительский процесс не удалил его должным образом.

Такие “неработающие” процессы наблюдаются в основном у дочерних процессов.

Как сохранить процессы, запущенные после выхода 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.

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий