Зомби-процессы в Linux: Поиск, удаление, предотвращение

15 мин чтения - 19 мая 2026 г.

hero section cover
Содержание
  • Зомби-процессы в Linux: как их найти и удалить
  • Почему зомби-процессы важны на серверах
  • Как найти зомби-процессы
  • Как удалить зомби-процессы
  • Предотвращение зомби-процессов
  • Заключение
Поделиться

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

Зомби-процессы в Linux: как их найти и удалить

Зомби-процесс — это дочерний процесс, который завершил выполнение, но по-прежнему занимает место в таблице процессов ядра. Он существует, потому что родительский процесс не вызвал wait() для сбора статуса завершения. Зомби не потребляют ресурсы ЦП или памяти, но каждый из них занимает PID. Если их накопится достаточное количество, ваша система не сможет запускать новые процессы. В этой статье рассказывается, как их обнаружить, удалить и предотвратить их появление в первую очередь.


 

Почему зомби-процессы важны на серверах

Один зомби-процесс безвреден. Проблема начинается, когда они накапливаются. Linux имеет ограниченное пространство PID: 32 768 в 32-разрядных системах и до 4 194 304 в 64-разрядных. Если зомби-процессы заполняют таблицу процессов, ядро не может создавать новые процессы. Это означает отсутствие новых подключений, новых рабочих потоков и вообще ничего нового.

Веб-серверы, такие как Apache и Nginx, особенно уязвимы, поскольку они запускают дочерние процессы для обработки трафика. Тесты показали падение пропускной способности на 48%, когда зомби накапливаются на загруженном веб-сервере. В 2019 году утечка канала Golang в DNS-поде Kubernetes создала более 26 000 зомби на одном узле, заполнив таблицу процессов и вызвав сбой разрешения DNS по всему кластеру.

В таблице ниже приведены основные различия между обычным процессом и зомби:

ХарактеристикаОбычный процессЗомби-процесс
Символ состоянияR, S, D или TZ (неактивный)
ЦП / ПамятьАктивное использование0% / 0 (уже завершено)
Запись в таблице процессовОдин слотОдин слот
Ответ на kill -9Прекращается немедленноБез эффекта (уже мертво)
Память ядраПолный дескриптор процессаТолько минимальный статус завершения

Важный вывод: вы не можете kill -9 зомби. Он уже мертв. Единственный способ очистить его — заставить родительский процесс убрать его или убить родительский процесс, чтобы init (PID 1) унаследовал его и автоматически убрал.

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

Зомби отображаются с буквой Z в столбце STAT и <defunct> рядом с именем команды. Выведите их списком с помощью:

ps aux | grep -w Z

Чтобы увидеть ID родительского процесса (PPID), который понадобится для удаления:

ps -eo pid,ppid,stat,comm | grep -w Z

Команда top команда также выводит общее количество зомби в строке заголовка. Для быстрой неинтерактивной проверки:

top -bn1 | grep zombie

Отслеживание родительского процесса с помощью pstree

Как только у вас будет PID зомби-процесса, отследите его до ответственного родительского процесса:

pstree -p -s <zombie_pid>

Это показывает полную родословную от init вплоть до зомби. Если pstree не установлен, ps auxf выводит аналогичное дерево в формате ASCII.

Подсчет зомби для мониторинга

Чистый подсчет, исключающий сам процесс grep:

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

Для непрерывного мониторинга во время устранения неполадок:

watch -n 1 'ps aux | grep -w Z | wc -l'

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

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

1. Найдите родительский процесс.

ps -o ppid= -p <zombie_pid>

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

kill -SIGCHLD <parent_pid>

Это указывает родительскому процессу вызвать wait() для всех завершенных дочерних процессов. Это не вызывает сбоев и работает с корректно работающими приложениями.

3. Если SIGCHLD не работает, перезапустите службу.

systemctl restart <service_name>

4. Если родительский процесс не отвечает, завершите его.

kill <parent_pid>

Или, если он игнорирует SIGTERM:

kill -9 <parent_pid>

Когда родительский процесс завершает работу, init (PID 1) либо systemd примите осиротевших зомби-процессы и немедленно их уничтожьте. Будьте осторожны в производственных системах. Убийство родительского процесса также приводит к завершению всех его активных дочерних процессов.

5. Проверьте очистку.

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

Если счетчик равен 0, то всё в порядке.

Предотвращение зомби-процессов

Обработка дочерних процессов в коде

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

  • C: Установите signal(SIGCHLD, SIG_IGN); , чтобы автоматически отбрасывать информацию о завершении дочерних процессов, или используйте обработчик сигналов с waitpid(-1, NULL, WNOHANG) для асинхронного сбора.
  • Python: Используйте subprocess.run(), который ожидает автоматически. Если используется Popen, вызовите proc.wait() явно.
  • Bash: Добавьте wait в конец скриптов, запускающих фоновые задания.

Настройте systemd правильно

Для служб, управляемых systemd, эти настройки предотвращают накопление зомби-процессов:

  • KillMode=control-group гарантирует, что все дочерние процессы будут завершены одновременно при остановке службы.
  • TimeoutStopSec дает родительскому процессу время на уборку дочерних процессов, прежде чем systemd отправит SIGKILL.
  • WatchdogSec автоматически перезапускает не отвечающие службы, улавливая случаи, когда родительский процесс зависает и перестает убирать дочерние процессы.

Мониторинг таблицы процессов

Настройте задание cron, которое запускается каждые 15 минут, чтобы подсчитывать зомби-процессы и выдавать предупреждение, если их количество превышает пороговое значение:

ps aux | awk '$8 ~ /Z/' | wc -l

Также следите за использованием таблицы процессов, сравнивая текущее количество с /proc/sys/kernel/pid_max. Если он превышает 80%, проведите расследование, прежде чем это станет проблемой. Несколько временных зомби-процессов во время нормальной работы не являются поводом для беспокойства. Растущее число, которое не снижается до нуля, указывает на ошибку в приложении, которую необходимо исправить.

Заключение

Зомби-процессы — это мертвые процессы, которые не были очищены. Они не используют ЦП или память, но занимают PID, а заполненная таблица процессов не позволяет вашему серверу выполнять какие-либо полезные действия.

  • Найдите их с помощью ps aux | grep -w Z и отследите родительский процесс с помощью pstree.
  • Удалите их, отправив SIGCHLD родительскому процессу, перезапустив службу или, в крайнем случае, завершив работу родительского процесса.
  • Предотвратите их появление, написав код, который вызывает wait(), правильно настраивая systemd и отслеживая таблицу процессов.

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

Блог

События этой недели

Другие статьи
Зомби-процессы в Linux: Поиск, удаление, предотвращение

Зомби-процессы в Linux: Поиск, удаление, предотвращение

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

15 мин чтения - 19 мая 2026 г.

Контрольный список по укреплению серверов Linux

15 мин чтения - 8 мая 2026 г.

Другие статьи
background image

У вас есть вопросы или вам нужно индивидуальное решение?

icon

Гибкие варианты

icon

Глобальный охват

icon

Мгновенное развертывание

icon

Гибкие варианты

icon

Глобальный охват

icon

Мгновенное развертывание