Ответ
Процесс-сирота (orphan process) — это дочерний процесс, чей родительский процесс завершился (или был убит) раньше него. В Unix-подобных системах, включая Linux, такие процессы не остаются бесхозными.
Механизм работы:
- Когда родительский процесс завершается, все его живые дочерние процессы автоматически усыновляются процессом с PID 1 — это
systemdв большинстве современных дистрибутивов (ранееinit). - Новый родитель (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важно, чтобы она корректно завершала все свои дочерние процессы, иначе они могут остаться висеть как сироты. - Отладке: Неожиданно существующие сиротированные процессы могут потреблять ресурсы и мешать перезапуску служб.