Ответ
В классической системе Linux процесс с PID 1 (обычно systemd, init или runit) является корневым и особым. Однако есть важные для DevOps исключения:
-
Внутри контейнеров: Это самый частый случай. По умолчанию процесс, указанный в
CMDилиENTRYPOINTDocker-образа, запускается с PID 1 внутри пространства имен (namespace) контейнера. Он не является полноценным init-процессом и может некорректно обрабатывать сигналы SIGTERM или осиротевшие (zombie) процессы. Для решения этой проблемы используют:- Флаг
--initв Docker, который запускает tiny-init как PID 1. - Запуск полноценного init-процесса внутри контейнера (например,
tini).# Без init: /bin/app будет PID 1 со всеми вытекающими проблемами docker run myapp:latest
С init: tiny-init будет PID 1 и корректно передаст сигналы /bin/app
docker run --init myapp:latest
- Флаг
-
Пространства имен PID (PID namespaces): При создании нового PID namespace процесс внутри него может видеть себя как PID 1, хотя в root namespace у него будет другой PID. Это основа изоляции процессов в контейнерах.
-
Специализированные/встроенные системы: Некоторые минималистичные или embedded системы могут обходиться без традиционного init, запуская сразу необходимое приложение как главный процесс.