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

Обновлено: 21.11.2024

Прежде чем вы узнаете о процессе Zombie, позвольте мне напомнить, что такое процесс в Linux.

Короче говоря, процесс – это запущенный экземпляр программы в режиме исполнения. Это может быть передний план (интерактивный процесс) или фон (не интерактивный или автоматический процесс). Это может быть родительский (создатель других процессов во время выполнения) или дочерний (процесс, созданный другими) процесс.

В Linux, за исключением первого процесса init (или systemd) с PID 0, все остальные процессы имеют родительский процесс. У процессов также есть свои дочерние процессы.

Не верите мне? Используйте команду pstree в терминале, чтобы просмотреть дерево процессов, чтобы увидеть «семейное древо» процессов вашей системы.

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

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

Вам действительно нужно беспокоиться о процессах-зомби?

Здесь важно сказать, что зомби-процессы не так опасны, как может звучать их название.

Проблема может возникнуть, если ваша система имеет ограниченный объем оперативной памяти или слишком много процессов-зомби потребляют оперативную память. Кроме того, для большинства процессов Linux максимальный PID может быть установлен на 32768. Если нет доступных идентификаторов для других продуктивных задач, ваша система может выйти из строя.

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

В таком случае было бы неплохо найти и убить зомби-процесс.

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

Процесс в Linux может находиться в одном из следующих состояний:

  • D = непрерывный сон
  • Я = бездействует
  • R = работает
  • S = спать
  • T = остановлен по сигналу управления заданием
  • t = остановлено отладчиком во время трассировки
  • Z = зомби

Но где можно увидеть процессы и их соответствующий статус? Один из простых способов — использовать терминал и команду top.

Как вы можете видеть на снимке экрана выше, всего 250 задач (или процессов), 1 выполняется, 248 процессов находятся в спящем режиме и 1 находится в состоянии зомби.

Теперь возникает вопрос, как убить зомби-процесс?

Как найти и убить зомби-процесс? Можно ли убить зомби-процесс?

Зомби-процесс уже мертв. Как убить уже мертвый процесс?

В фильмах о зомби вы стреляете зомби в голову или сжигаете ее. Это не вариант здесь. Вы можете сжечь свою систему за уничтожение зомби-процесса, но это не реальное решение ;)

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

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

8-й столбец выходных данных команды ps ux отображает состояние процесса. Вы просите вывести все совпадающие строки, в которых состояние процесса равно Z+ (что указывает на состояние зомби).

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

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

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

Вы можете проверить, был ли уничтожен процесс-зомби, снова запустив команду ps или даже команду top.

Дэйв Маккей

Дэйв Маккей
Писатель

Фатмавати Ахмад Заэнури/Shutterstock

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Зомби не страшны…

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

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

  • › Лучшие дистрибутивы Linux без systemd
  • › Как установить Google Play Маркет в Windows 11
  • ›5 шрифтов, которые следует прекратить использовать (и лучшие альтернативы)
  • › Почему прозрачные чехлы для телефонов желтеют?
  • › Как восстановить метки панели задач в Windows 11
  • › Что означает XD и как вы его используете?
  • › Почему не было Windows 9?

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

Такие «несуществующие» процессы происходят главным образом для дочерних процессов. Родительский процесс считывает статус завершения своего дочернего процесса. Это делается с помощью системного вызова wait(). Как только это будет сделано, процесс зомби будет устранен. Это называется пожинать плоды зомби-процесса.

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

Как работает состояние зомби-процесса

Прежде чем перейти к состоянию зомби-процесса, давайте кратко рассмотрим состояния процессов в Linux.

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

Плата Linux содержит состояние процесса, номер процесса, счетчик процессов, регистры, список открытых файлов, информацию о планировании ЦП, информацию об управлении памятью и информацию о состоянии ввода-вывода. Может быть 5 состояний процесса, это R, S, D, T и Z. R — запущенный процесс, S — спящий процесс, D — непрерываемое спящее состояние, T — завершенный или остановленный процесс и Z это зомби-процесс.

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

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

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

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

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

Факты о зомби-процессах

Некоторые интересные факты о зомби-процессах включают в себя:

Вся системная память и другие ресурсы, выделенные зомби-процессу, освобождаются, когда он завершается с помощью системного вызова exit().

Но его запись в таблице остается доступной.

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

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

Если родительский процесс не использует функцию ожидания(), зомби остается в таблице процессов. Это создает утечку ресурсов.

Отправляя сигнал SIGCHLD родительскому процессу с помощью команды kill, вы можете удалить зомби-процесс из системы.

Если процесс-зомби остается в таблице процессов даже после отправки сигнала SIGCHLD, родительский процесс должен быть завершен, если это приемлемо.

Опасны ли зомби-процессы?

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

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

Как найти и уничтожить зомби-процесс

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

Z в столбце STAT и/или [defunct] в последнем выходном столбце указывает на процесс-зомби.

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

После получения идентификатора родительского процесса зомби отправьте SIGCHLD родительскому процессу.

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

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

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

Заключение

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

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

Об авторе

Супарна Гангули

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

Эта история стара как эпоха. С тех пор, как появились C, Unix и (позже) Linux, у нас появились зомби. В частности, есть процессы, помеченные как процесс-зомби. Непонимаемый некоторыми, игнорируемый другими и невосприимчивый к усилиям многих из нас, пытающихся убить эти процессы без особого успеха. Почему так?

Что такое процесс в Linux?

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

Иногда процесс запускает другой процесс, делая первый процесс родителем второго. Команда pstree — отличный инструмент, который позволяет вам увидеть «генеалогию» процессов в вашей системе.

Каждому процессу присваивается номер в системе. Идентификатор процесса номер 1 назначается самому первому процессу, выполняемому во время процесса загрузки, и каждый последующий процесс после PID 1 является его потомком. Процесс PID 1 — это init, который в большинстве новых версий Linux представляет собой просто символическую ссылку на программу systemd.

Дополнительные ресурсы по Linux

Завершение процесса командой kill

Вы можете завершать процессы в системе Linux с помощью команды kill. Несмотря на название, команда kill и ряд других, таких как pkill и killall, были написаны/разработаны для отправки СИГНАЛОВ одному или больше процессов. Если он не указан, по умолчанию он отправляет СИГНАЛ SIGTERM для завершения процесса.

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

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

С другой стороны, зомби-процессы нельзя убить! Почему вы можете спросить? Ну, потому что они уже мертвы!

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

Вот почему попытка выполнить команду kill даже с параметром -9 (SIGKILL) для несуществующего (зомби) процесса не работает, потому что убивать нечего.

Итак, чтобы убить процесс-зомби, то есть удалить его имя из списка процессов (таблицы процессов), вы должны убить его родителя. Например, если PID 5878 — это процесс-зомби, а его родительский процесс — PID 4809, то для уничтожения зомби (5878) вы завершаете родительский процесс (4809):

Мое последнее предупреждение о зомби. Будьте очень осторожны при уничтожении родительских процессов. Если родителем процесса является PID 1, и вы убьете его, вы перезагрузитесь!

И это будет еще более страшная история!

Что произойдет, если вы намеренно завершите работу контейнеров Kubernetes?

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

Диагностика проблем с подключением с помощью команды ping Linux

Одним из основных инструментов диагностики сетевого подключения является команда ping.

Читайте также: