Зомби-процессы в Linux: Поиск, удаление, предотвращение
15 мин чтения - 19 мая 2026 г.

Узнайте, как выявлять, удалять и предотвращать зомби-процессы в 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 или T | Z (неактивный) |
| ЦП / Память | Активное использование | 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. Команды, исправления кода и советы по мониторингу для администраторов серверов.
15 мин чтения - 19 мая 2026 г.
Контрольный список по укреплению серверов Linux
15 мин чтения - 8 мая 2026 г.

У вас есть вопросы или вам нужно индивидуальное решение?
Гибкие варианты
Глобальный охват
Мгновенное развертывание
Гибкие варианты
Глобальный охват
Мгновенное развертывание