Ответ
Зомби-процессы (состояние Z или defunct) — это завершившиеся процессы, записи о которых остаются в таблице процессов ядра, потому что их родительский процесс не вызвал системный вызов wait() (или его варианты) для чтения статуса завершения.
Основная опасность:
- Исчерпание PID: Каждый зомби-процесс занимает запись в таблице процессов. Если таких процессов становится слишком много, система может исчерпать доступные идентификаторы процессов (PID), что сделает невозможным запуск новых процессов.
- Загромождение вывода
ps: Усложняет мониторинг системы.
Важно: Зомби-процессы не потребляют память (RAM) и не используют процессорное время (CPU). Они представляют собой лишь «скелет» — запись в таблице процессов с минимальной информацией (PID, статус выхода, учет ресурсов).
Как возникают и как с ними бороться в контексте DevOps:
- Некорректный родительский процесс: Если родительское приложение (например, самописный демон или скрипт) не обрабатывает завершение дочерних процессов, оно создает зомби. Решение — исправить код приложения.
- Временное состояние: Часто это нормально и кратковременно. Процесс
init(илиsystemdв современных системах) усыновляет осиротевшие процессы и периодически вызываетwait()для них, убирая зомби. - Убийство родителя: Если зомби не исчезают, часто единственный чистый способ — завершить родительский процесс. После этого
init/systemdочистит его дочерние зомби-процессы.
Пример (для понимания): Следующий Bash-скрипт создаст зомби на 30 секунд:
#!/bin/bash
# Родительский процесс
echo "Parent PID: $$"
# Запускаем дочерний процесс, который сразу завершится
( sleep 1; exit 0 ) &
# Родитель НЕ ждет завершения ребенка (не вызывает wait), а спит
echo "Child launched, parent sleeping..."
sleep 30
# Проверьте 'ps aux | grep defunct' в другом терминале во время сна родителя.