Что такое зомби процессы
Зомби-процесс — это завершившийся процесс, который всё ещё присутствует в таблице процессов операционной системы, потому что его родительский процесс не получил и не обработал статус его завершения. Такое поведение характерно для UNIX-подобных систем и является следствием механизма управления процессами.
Как это работает
Когда дочерний процесс завершает работу, он отправляет родительскому процессу сигнал (SIGCHLD). До того как родительский процесс вызовет системный вызов wait() или waitpid() для получения кода завершения, дочерний процесс остаётся в таблице процессов в состоянии «зомби» (обозначается статусом Z). В этот момент система хранит только минимальную информацию о процессе — например, код возврата, — чтобы родительский процесс мог её получить. Сам зомби-процесс не использует процессорное время и память, но занимает слот в таблице процессов.
Пример
Рассмотрим простой пример на bash, который создаёт зомби-процесс:
#!/bin/bash
# Запускаем дочерний процесс в фоне
sleep 5 &
CHILD_PID=$!
# Ждём завершения дочернего процесса
wait $CHILD_PID
# После завершения дочерний процесс становится зомби,
# пока родительский процесс не вызовет wait()
# В этом примере wait() вызывается сразу, поэтому зомби не остаётся.Если родительский процесс не вызывает wait(), зомби-процесс будет существовать до тех пор, пока родительский процесс не завершится. После завершения родительского процесса зомби-процесс становится сиротой и передаётся процессу init (PID 1), который автоматически вызывает wait() и очищает его.
Подводные камни
- Накопление зомби: Если родительский процесс создаёт много дочерних процессов и не обрабатывает их завершение, зомби-процессы могут заполнить таблицу процессов, что приведёт к невозможности создания новых процессов.
- Диагностика: Зомби-процессы видны в выводе команды
ps auxсо статусомZ. Например:Z [sleep] <defunct>. - Устранение: Основные способы борьбы с зомби:
- Исправить код родительского процесса, чтобы он вызывал
wait()илиwaitpid()после завершения дочерних процессов. - Перезапустить родительский процесс — тогда зомби-процессы будут переданы
initи очищены. - Использовать обработчик сигнала
SIGCHLDв родительском процессе для автоматического вызоваwait().
- Исправить код родительского процесса, чтобы он вызывал
Когда использовать
Понимание зомби-процессов важно для DevOps-инженеров при диагностике проблем с производительностью и стабильностью системы. Если в системе наблюдается большое количество процессов в состоянии Z, это сигнал о том, что какое-то приложение некорректно обрабатывает завершение своих дочерних процессов. В контейнерных средах (Docker, Kubernetes) зомби-процессы могут накапливаться внутри контейнера, если процесс PID 1 не настроен на сбор статусов дочерних процессов.
Коротко
- Зомби-процесс — завершившийся процесс, ожидающий, пока родительский процесс вызовет
wait(). - Зомби не потребляют CPU и память, но занимают слот в таблице процессов.
- Обнаружить зомби можно по статусу
Zв выводеps. - Устраняются исправлением кода родительского процесса или его перезапуском.
Похожие вопросы
- Что показывает load average33%
- Чем отличается Terraform от Ansible ELK stack33%
- Чем отличаются роли от плейбуков33%
- В чём разница между контейнеризацией и виртуализацией33%
- Что такое kafka33%
- Какой у вас опыт работы с докером33%
- Насколько сложные приходилось писать пайплайны на gitlab CI с использованием инклудов якорей33%
- Что такое kubernetes33%