Когда init-процесс (PID 1) не является главным в операционной системе?

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

Ответ

В классической системе Linux процесс с PID 1 (обычно systemd, init или runit) является корневым и особым. Однако есть важные для DevOps исключения:

  1. Внутри контейнеров: Это самый частый случай. По умолчанию процесс, указанный в CMD или ENTRYPOINT Docker-образа, запускается с 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

  2. Пространства имен PID (PID namespaces): При создании нового PID namespace процесс внутри него может видеть себя как PID 1, хотя в root namespace у него будет другой PID. Это основа изоляции процессов в контейнерах.

  3. Специализированные/встроенные системы: Некоторые минималистичные или embedded системы могут обходиться без традиционного init, запуская сразу необходимое приложение как главный процесс.