Вопрос с собеседования · DevOps

Какие состояния бывают у процесса в Linux и что такое зомби и сироты?

MiddleLinux и диагностика
Ещё спрашивают так:
  • Что значит состояние D в ps?
  • Как убить процесс-зомби?
Коротко

В ps видно состояние: R — выполняется или ждёт CPU, S — спит в ожидании события (норма для большинства), D — непрерываемый сон в ожидании ввода-вывода (не реагирует даже на SIGKILL), T — остановлен, Z — зомби: процесс завершился, но родитель не забрал код выхода через wait. Зомби не занимает память, только запись в таблице процессов; убить его нельзя — нужно исправить или перезапустить родителя.

  • Сирота — родитель умер раньше, процесс усыновляет PID 1 (или subreaper)
  • Много процессов в D — проблема с диском или сетевой ФС (NFS); они поднимают load average
  • Тысячи зомби исчерпывают лимит PID — новые процессы не создаются

А ещё В контейнере без init зомби некому собирать — отсюда tini

Подробно

Как смотреть:

ps -eo pid,ppid,stat,cmd --forest   # дерево с состояниями
ps -eo stat,ppid | awk '$1 ~ /^Z/'  # зомби и их родители
cat /proc/PID/status                # State, родитель, потоки

Зомби. После завершения ядро хранит код выхода, пока родитель не вызовет wait. Если родитель забыл (ошибка в коде, запускает дочерние процессы и не ждёт их), зомби копятся. Лечение — исправить родителя или завершить его: тогда зомби перейдут к PID 1, который их соберёт.

D-состояние. Процесс ждёт ответа устройства внутри ядра и не может быть прерван. Зависшее NFS-хранилище или умирающий диск дают «неубиваемые» процессы и высокий load average при пустом CPU.

Сироты и PID 1. Обычный init собирает усыновлённых сирот. В контейнере PID 1 — само приложение, которое этого не умеет, поэтому используют tini или --init.

Что хотят услышать

  • Основные состояния процесса.
  • Природа зомби и почему их не убить.
  • Связь D-состояния с load average, роль PID 1.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Процесс в состоянии D немедленно реагирует на SIGKILL
  • ✓Зомби — завершённый процесс, чей код выхода родитель ещё не забрал через wait
  • ✗Зомби — зависший процесс, который занимает память и не реагирует на SIGTERM, только на SIGKILL
  • ✗Состояние S означает зависание процесса

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования