Что такое процесс-сирота (orphan process) в Linux и как с ним работает система?

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

Ответ

Процесс-сирота (orphan process) — это дочерний процесс, чей родительский процесс завершился (или был убит) раньше него. В Unix-подобных системах, включая Linux, такие процессы не остаются бесхозными.

Механизм работы:

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

Практический пример и последствия для DevOps: Частая ситуация — запуск демона из скрипта инициализации или SSH-сессии. Если скрипт/сессия завершится, а демон продолжит работу, он станет сиротой.

# Пример: Запуск фонового процесса из оболочки
$ sleep 300 &
[1] 12345  # PID дочернего процесса: 12345
$ exit     # Завершение родительской оболочки

# После этого процесс sleep 300 становится сиротой и усыновляется systemd/init.
# Проверить его нового родителя можно:
$ ps -ef | grep "sleep 300" | grep -v grep
root     12345     1  0 14:30 ?        00:00:00 sleep 300
# PPID (родительский PID) теперь равен 1.

Важность для DevOps: Понимание этого механизма критично при:

  • Написании скриптов инициализации контейнеров: В Docker-контейнерах PID 1 имеет особую роль (обработка сигналов). Если ваш entrypoint-скрипт запускает фоновые процессы и завершается, они станут сиротами и могут некорректно обрабатывать сигналы (например, SIGTERM при остановке контейнера). Решение — использовать менеджеры процессов (tini, dumb-init) или корректно обрабатывать завершение дочерних процессов в скрипте.
  • Управлении службами: При остановке службы через systemctl stop важно, чтобы она корректно завершала все свои дочерние процессы, иначе они могут остаться висеть как сироты.
  • Отладке: Неожиданно существующие сиротированные процессы могут потреблять ресурсы и мешать перезапуску служб.