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

5 февраля 2021 |

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

A terminal window on a Linux laptop. Fatmawati Achmad Zaenuri / Shutterstock

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

Как состояния процессов работают в Linux

Linux, конечно же, должен отслеживать все приложения и демоны, работающие на вашем компьютере. Один из способов сделать это — поддерживать таблицу процессов. Это список структур в памяти ядра. У каждого процесса есть запись в этом списке, содержащая некоторую информацию о нем.

В каждой из структур таблицы процессов не так много деталей. Они содержат идентификатор процесса, несколько других элементов данных и указатель на блок управления процессом (PCB) для этого процесса.

Именно PCB содержит множество деталей, которые Linux необходимо найти или установить для каждого обработать. Плата также обновляется по мере создания процесса с учетом времени обработки и, наконец, уничтожается.

PCB Linux содержит более 95 полей. Он определяется как структура с именем task_struct.h и состоит из более 700 строк. Плата содержит следующие типы информации:

  • Состояние процесса: состояния описаны ниже.
  • Номер процесса: его уникальный идентификатор в операционной системе.
  • Program Counter: когда этому процессу в следующий раз будет предоставлен доступ к ЦП, система будет использовать этот адрес для поиска следующей инструкции процесса, который должен быть выполнен.
  • Регистры: список регистров ЦП, используемых этим процессом. Список может содержать аккумуляторы, индексные регистры и указатели стека.
  • Открыть список файлов: файлы, связанные с этим процессом.
  • Информация о расписании ЦП: используется для определения того, как часто и как long, этому процессу отводится время обработки ЦП. Приоритет процесса, указатели на очереди планирования и другие параметры планирования должны быть записаны на плате.
  • Информация об управлении памятью: подробные сведения о памяти, которую использует этот процесс, например, начальный и конечный адреса памяти процесса и указатели на страницы памяти.
  • Состояние ввода-вывода Информация: любые устройства ввода или вывода, используемые процессом.

«Состояние процесса» может быть любым из следующих:

  • R: Работающий или работоспособный процесс. Запуск означает, что он получает циклы ЦП и выполняется. Готовый к работе процесс готов к запуску и ждет слота ЦП.
  • S: Спящий процесс. Процесс ожидает завершения действия, такого как операция ввода или вывода, или пока ресурс не станет доступным.
  • D: Процесс находится в состоянии непрерывного сна. Он использует системный вызов блокировки и не может продолжаться, пока системные вызовы не завершатся. В отличие от состояния «сна», процесс в этом состоянии не будет отвечать на сигналы до тех пор, пока системный вызов не будет завершен и выполнение не вернется к процессу.
  • T: процесс завершен (остановлен), поскольку он получил сигнал SIGSTOP. Он будет отвечать только на сигналы SIGKILL или SIGCONT, которые либо завершают процесс, либо дают ему команду продолжить, соответственно. Вот что происходит, когда вы переключаетесь с задач переднего плана (fg) на фоновые (bg).
  • Z: Зомби-процесс. Когда процесс завершается, он не исчезает просто так. Он освобождает всю используемую память и удаляет себя из памяти, но его записи в таблице процессов и на плате остаются. Его состояние установлено в EXIT_ZOMBIE, и его родительский процесс уведомляется (сигналом SIGCHLD) о завершении дочернего процесса.

В состоянии Zombie родительский процесс процесс вызывает одно из семейств функций wait () при создании дочернего процесса. Затем он ждет изменения состояния в дочернем процессе. Был ли дочерний процесс остановлен, продолжен или уничтожен сигналом? Завершился ли он путем естественного завершения своего кода?

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

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

Плохо написанный родительский процесс может не вызвать функцию wait () при создании дочернего процесса. Это означает, что ничто не отслеживает изменения состояния в дочернем процессе, и сигнал SIGCHLD будет проигнорирован. Или, возможно, другое приложение влияет на выполнение родительского процесса из-за плохого программирования или злого умысла.

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

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

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

Как удалить процессы зомби

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

Единственное надежное решение — убить родительский процесс. Когда он завершается, его дочерние процессы наследуются процессом init, который является первым процессом, который запускается в системе Linux (его идентификатор процесса равен 1).

Процесс init регулярно выполняет необходимую очистку от зомби, поэтому, чтобы убить их, вам просто нужно убить процесс, который их создал. Команда top — удобный способ узнать, есть ли у вас зомби.

Введите следующее:

top

В этой системе восемь процессов-зомби . Мы можем перечислить их, используя команду ps и передав ее в egrep. Опять же, у процессов зомби есть государственный флаг «Z», и вы обычно также увидите «несуществующие».”

Введите следующее:

ps aux | egrep «Z | defunct»

Перечислены процессы зомби.

Это более аккуратный способ чтобы узнать идентификаторы процессов зомби, чем пролистывать вверх и вниз. Мы также видим, что приложение под названием «badprg» породило этих зомби.

Идентификатор процесса первого зомби — 7641, но нам нужно найти идентификатор процесса его родительского процесса. Мы можем сделать это снова, используя ps. Мы будем использовать параметр вывода (-o), чтобы указать ps отображать только идентификатор родительского процесса, а затем передадим его с флагом ppid =.

Процесс, который мы хотим найти, будет обозначен с помощью -p (процесс), а затем передать идентификатор процесса зомби.

Поэтому мы вводим следующую команду для поиска информации о процессе для процесса 7641, но она будет сообщать только идентификатор родительского процесса:

ps -o ppid = -p 7641

Нам сказали, что идентификатор родительского процесса — 7636. Теперь мы можем сделать перекрестную ссылку, используя ps еще раз.

Мы видим, что это соответствует названию родительского процесса ранее. Чтобы убить родительский процесс, используйте параметр SIGKILL с командой kill следующим образом:

kill -SIGKILL 7636

В зависимости от владельца родительского процесса вам также может потребоваться использовать sudo.

Zombies Aren ‘ t Страшно…

… если только они не в огромной орде. Некоторым не о чем беспокоиться, и простая перезагрузка уничтожит их.

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

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

Tags:

Напишите пару строк: