Что такое зомби-процессы в Linux и как их уничтожить
Зомби-процессы — это остатки закрытого программного обеспечения. Вот как зомби-процессы могут замедлять работу системы Linux и как их убить.
Зомби-процесс. Не все слышали об этом интересном, но страшном слове, связанном с операционной системой Linux. На персональном компьютере процессы-зомби могут не представлять угрозы для обычного пользователя, но когда дело доходит до серверов Linux, эти процессы должны быть идентифицированы и остановлены.
Такие процессы могут вызвать проблемы с таблицей процессов вашей системы и, в свою очередь, нарушить надлежащее функционирование вашего компьютера. Поэтому в этой статье мы подробно обсудим зомби-процессы, а также подробное руководство по поиску и уничтожению зомби-процессов на машине Linux.
Что такое зомби-процессы?
Но прежде всего важно, чтобы вы знали, что такое зомби-процессы на самом деле. Это не что иное, как мертвые и несуществующие процессы, которые занимают место в таблице системных процессов.
Таблица процессов состоит из идентификатора процесса, ссылки на печатную плату и другой полезной информации, связанной с процессом. Процессы-зомби имеют свои собственные идентификаторы процессов и информацию об управлении памятью. Поскольку ОС Linux имеет ограниченное количество доступных идентификаторов процессов, другие процессы не могут использовать PID, пока процесс-зомби не остановится.
Хотя один или два зомби-процесса не вызовут никаких сбоев или проблем с производительностью на вашем компьютере, большое количество таких процессов может нанести вред рабочему процессу вашей системы, затопив таблицу процессов и ресурсы.
Что вызывает зомби-процессы в Linux?
Чтобы детально понять основную причину процесса-зомби, вам нужно узнать, как процессы запускаются и останавливаются в Linux. Операционная система Linux отслеживает все запущенные процессы и демоны на компьютере. Таблица процессов — это список структур, который содержит все процессы, которые в данный момент выполняются на вашем компьютере.
Каждая запись процесса в таблице процессов состоит из ссылки на блок управления процессом этого конкретного процесса. Хранятся все детали, связанные с этим конкретным процессом. Эти сведения включают:
- Состояние процесса : текущее состояние процесса
- Номер процесса : уникальный номер, используемый для идентификации процесса
- Счетчик программ : содержит информацию, относящуюся к следующей инструкции
- Регистры : список всех регистров процессора, используемых процессом
- Список файлов : файлы, используемые процессом
- Информация о расписании процессора : содержит информацию, связанную с процессорным временем и ресурсами, выделенными процессу
- Информация об управлении памятью : включает сведения об объеме памяти, используемой процессом
- Информация о вводе / выводе : список устройств ввода или вывода, используемых процессом
Linux использует следующие состояния процесса для описания всех своих процессов.
- R : запущенный процесс
- S : спящий процесс
- D : непрерывный спящий процесс
- T : завершенный процесс
- Z : зомби-процесс
Всякий раз, когда процесс завершает поставленную задачу, его состояние процесса устанавливается как Zombie или Z. У каждого процесса есть родительский процесс, который вызывает семейство функций с именем wait() , которые ожидают изменения состояния процесса. Например, если состояние процесса изменится с запущенного на Зомби , будет запущен метод wait() .
Метод wait () обычно удаляет блок управления процессом, связанный с этим зомби-процессом, а затем удаляет запись этого процесса из таблицы процессов.
Но иногда из-за плохой разработки программы родительский процесс не вызывает функцию wait() . И в результате система не удаляет процесс зомби. Запись в таблице процессов для этого конкретного процесса также остается неизменной.
Это дает процессу зомби бесконечный срок службы. Поскольку система не может убить процесс, запись процесса никогда не удаляется, а PID никогда не освобождается.
Как найти зомби-процессы?
Первым шагом к удалению процессов-зомби в вашей системе является анализ того, какой процесс имеет состояние процесса- зомби . Хотя вы не сможете убить эти процессы напрямую, поскольку система уже удалила их из памяти, вы можете убить родительский процесс, связанный с ними.
Во-первых, вам нужно проверить, есть ли в таблице процессов вашей системы зомби-процесс. Вы можете сделать это легко, используя команду top . Просто откройте свой терминал и введите:
Зомби процессы Linux
Каждая программа, которая выполняется в Linux, — это системный процесс, у которого есть свой идентификатор. Каждый процесс может запускать дочерние процессы с помощью функции fork. Такие процессы остаются под контролем родительского процесса и не могут быть завершены без его ведома. Если один из дочерних процессов всё же завершился, а его родительский процесс не смог получить об этом информацию, то такой дочерний процесс становится зомби.
Зомби процессы Linux не выполняются и убить их нельзя, даже с помощью sigkill, они продолжают висеть в памяти, пока не будет завершён их родительский процесс.
Посмотреть такие процессы можно с помощью утилиты ps, здесь они отмечаются как defunct:
Если вы попытаетесь убить такой процесс с помощью сигнала KILL, то ничего не выйдет:
Чтобы его завершить, нужно найти «родителя» этого процесса. Для этого используйте команду:
Здесь идентификатор родительского процесса находится в четвёртой колонке (PPID). Теперь мы можем послать ему сигнал завершения, и такого процесса в системе больше не будет:
Для большего удобства вы можете использовать утилиты top или htop, но принцип их действия будет аналогичным, поэтому я не буду здесь его рассматривать. Теперь вы знаете, что делать, если в вашей системе появились зомби процессы Linux.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.