В чем разница между процессом-сиротой и зомби-процессом в Linux?

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

Ответ

Процесс-сирота (orphan process) — это живой дочерний процесс, родитель которого завершился. В этом случае ядро Linux назначает ему нового родителя — процесс init (или systemd с PID 1). Сирота продолжает нормально выполняться.

Зомби-процесс (zombie process) — это завершенный дочерний процесс, запись о котором остаётся в таблице процессов, потому что родительский процесс ещё не прочитал его статус завершения с помощью системного вызова wait() или его вариантов. Зомби не потребляет ресурсы CPU или память, но занимает запись в таблице процессов (PID).

Ключевые отличия:

  • Состояние: Сирота — живой (R/S), зомби — мертвый (Z).
  • Причина: Сирота возникает из-за смерти родителя, зомби — из-за того, что родитель не обработал статус завершения.
  • Решение: Сироты работают самостоятельно и завершатся сами. Зомби исчезают, когда родитель вызывает wait() или когда родитель умирает (тогда зомби "усыновляет" init, который автоматически выполнит wait).

Пример на практике (Bash):

# Создание зомби: дочерний процесс завершается быстрее, чем родитель читает статус
#!/bin/bash
# Дочерний процесс
if [ "$1" = "child" ]; then
  echo "Child PID: $$"; exit 0
fi
# Родительский процесс запускает дочерний и не ждет его
./script.sh child &
sleep 10  # В этот момент завершенный дочерний процесс будет в состоянии Z (зомби)
# wait # Если раскомментировать wait, зомби будет убран

Для поиска зомби-процессов используйте ps aux | grep 'Z' или top.