Чем опасны зомби-процессы в Linux?

«Чем опасны зомби-процессы в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Зомби-процессы (состояние Z или defunct) — это завершившиеся процессы, записи о которых остаются в таблице процессов ядра, потому что их родительский процесс не вызвал системный вызов wait() (или его варианты) для чтения статуса завершения.

Основная опасность:

  • Исчерпание PID: Каждый зомби-процесс занимает запись в таблице процессов. Если таких процессов становится слишком много, система может исчерпать доступные идентификаторы процессов (PID), что сделает невозможным запуск новых процессов.
  • Загромождение вывода ps: Усложняет мониторинг системы.

Важно: Зомби-процессы не потребляют память (RAM) и не используют процессорное время (CPU). Они представляют собой лишь «скелет» — запись в таблице процессов с минимальной информацией (PID, статус выхода, учет ресурсов).

Как возникают и как с ними бороться в контексте DevOps:

  1. Некорректный родительский процесс: Если родительское приложение (например, самописный демон или скрипт) не обрабатывает завершение дочерних процессов, оно создает зомби. Решение — исправить код приложения.
  2. Временное состояние: Часто это нормально и кратковременно. Процесс init (или systemd в современных системах) усыновляет осиротевшие процессы и периодически вызывает wait() для них, убирая зомби.
  3. Убийство родителя: Если зомби не исчезают, часто единственный чистый способ — завершить родительский процесс. После этого 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' в другом терминале во время сна родителя.