Что происходит с дочерними процессами в Linux, если завершить родительский процесс?

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

Ответ

Если родительский процесс завершается (нормально или принудительно), его дочерние процессы становятся "сиротами" (orphaned). В Linux/Unix системах такие процессы автоматически усыновляются процессом с PID 1 — это init или, в современных дистрибутивах, systemd. Этот процесс-приемник периодически вызывает wait() для сбора статуса завершения сирот.

Ключевые моменты:

  • Если дочерний процесс уже завершился и находится в состоянии зомби (zombie), init/systemd вызовет wait() и освободит его запись в таблице процессов.
  • Если дочерний процесс продолжает выполняться, он будет работать дальше под управлением PID 1.
  • Это стандартное поведение ядра, предотвращающее накопление зомби-процессов.

Пример на Bash, демонстрирующий усыновление:

# Запускаем процесс, который создаст дочерний и завершится
sleep 60 &
CHILD_PID=$!
echo "Дочерний PID: $CHILD_PID, его родитель: $(ps -o ppid= -p $CHILD_PID)"
# Убиваем родительский процесс (текущую оболочку) - НЕ ВЫПОЛНЯЙТЕ В ПРОДУКТИВНОЙ СРЕДЕ
# kill -9 $$
# После этого, в другой сессии, можно проверить:
# ps -o ppid= -p $CHILD_PID
# Результат будет 1

На практике с этим сталкиваются при некорректном завершении демонов или контейнеров.