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

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

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

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

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

Таблица процессов состоит из идентификатора процесса, ссылки на плату и другой полезной информации, связанной с процессом. У зомби-процессов есть собственные идентификаторы процессов и информация об управлении памятью. Поскольку ОС Linux имеет ограниченное количество доступных идентификаторов процессов, другие процессы не могут использовать идентификаторы PID, пока процесс-зомби не остановится.

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

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

Чтобы подробно понять основную причину зомби-процесса, вам нужно узнать, как процессы запускаются и останавливаются в Linux. Операционная система Linux контролирует все запущенные процессы и демоны на компьютере. Таблица процессов – это список структур, содержащий все процессы, которые в данный момент выполняются на вашем компьютере.

Каждая запись процесса в таблице процессов состоит из ссылки на блок управления процессом этого конкретного процесса. На плате хранятся детали, связанные с этим конкретным процессом. Эти детали включают:

  1. Состояние процесса : текущее состояние процесса.
  2. Номер процесса : уникальный номер, используемый для идентификации процесса.
  3. Счетчик программ : содержит информацию, относящуюся к следующей инструкции.
  4. Регистры : список всех регистров ЦП, используемых процессом.
  5. Список открытых файлов : файлы, используемые процессом.
  6. Информация о расписании ЦП : содержит информацию, связанную с временем ЦП и ресурсами, выделенными процессу.
  7. Информация об управлении памятью : включает сведения об объеме памяти, используемой процессом.
  8. Информация о вводе / выводе : список устройств ввода или вывода, используемых процессом.

Linux использует следующие состояния процессов для описания всех своих процессов.

  • R : Запущенный процесс
  • S : процесс сна
  • D : непрерывный спящий процесс
  • T : завершенный процесс
  • Z : процесс зомби

Каждый раз, когда процесс завершает поставленную задачу, его состояние устанавливается как Zombie или Z. У каждого процесса есть родительский процесс, который вызывает семейство функций с именем wait () , ожидающих изменения состояния процесса. Например, если состояние процесса изменится с Running на Zombie , будет запущен метод wait () .

Метод wait () обычно удаляет блок управления процессом, связанный с этим процессом-зомби, а затем удаляет запись этого процесса из таблицы процессов.

Но иногда из-за плохой разработки программы родительский процесс не вызывает функцию wait () . В результате система не удаляет плату зомби-процесса. Запись в таблице процессов для этого конкретного процесса также остается неизменной.

Это дает зомби-процессу бесконечную продолжительность жизни. Поскольку система не может убить процесс, запись процесса никогда не удаляется, и PID никогда не освобождается.

Узнать больше: Способы убить не отвечающие программы в Linux

Как найти процессы зомби?

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

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

 top

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

Вы можете перечислить информацию, относящуюся к этим зомби-процессам, выполнив команду ps с помощью egrep . Egrep – это расширение команды grep в Linux, которая обрабатывает все шаблоны как расширенную строку регулярного выражения.

Связанный: Руководство для начинающих по регулярным выражениям с Python

Введите следующую команду, чтобы вывести список всех зомби-процессов:

 ps aux | egrep "Z|defunct"

Вышеупомянутая команда будет искать строки, содержащие Z или несуществующие в выводе, созданном командой ps. Вывод состоит из списка процессов-зомби, запущенных в вашей системе.

Завершение процессов зомби с помощью команды kill

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

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

Чтобы убить процессы-зомби, не выключая сервер, запишите идентификатор любого процесса-зомби. Из предыдущего раздела мы видим, что PID процесса зомби был 18614. Затем используйте этот PID, чтобы найти идентификатор родительского процесса.

 ps -o ppid= -p 18614

Выход:

 18613

Проверьте, существует ли идентификатор родительского процесса, с помощью команды ps .

 ps -e | grep 18613

Теперь, когда мы подтвердили существование родительского процесса, пора его убить. Передайте флаг -SIGKILL с командой kill следующим образом:

 sudo kill -SIGKILL 18613

После того, как вы убили родительский процесс, система автоматически удалит зомби-процесс и удалит его из таблицы процессов.

Эффективное управление процессами в Linux

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

Если вы новичок в Linux и не знаете, как операционная система Linux управляет процессами, лучше всего начать с изучения процессов.