Завершение процессов
100%

Процессы · Урок 5

Завершение процессов

Узнайте, как код завершения, ожидание, зомби и смена родителя завершают жизненный цикл процесса Linux.

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

Код завершения

Нормально завершающаяся программа передаёт целочисленный код. По соглашению код 0 означает успех, а ненулевое значение сообщает о некоторой ошибке или альтернативном результате. Точный смысл ненулевых значений относится к интерфейсу конкретной программы.

В оболочке проверьте код последнего конвейера переднего плана:

$ command
$ printf '%s\n' "$?"

Оболочки предоставляют ограниченный закодированный диапазон и также представляют завершение сигналом, поэтому это значение не является полной диагностической записью. Программы должны документировать собственные коды завершения.

Какой нормальный код завершения по соглашению Unix означает успех?

Ожидание и сбор

Ядро записывает способ завершения потомка и уведомляет его родителя. Родитель использует вызов из семейства системных вызовов wait(), чтобы получить эти сведения. Получение записи называется сбором процесса.

Ожидание также может координировать выполнение: оболочка ждёт команду переднего плана до показа нового приглашения, но может отложить ожидание фонового задания. Правильно спроектированный долговременный родитель должен собирать потомков, не блокируя постороннюю работу.

Что успешная операция wait позволяет получить родителю?

Процессы-зомби

После завершения потомка, но до сбора его записи о завершении, он отображается как зомби, часто с состоянием Z в ps. Он больше не выполняется и не хранит обычное адресное пространство, но минимальная запись таблицы процессов и учётные сведения остаются.

Отправка сигнала зомби не может заставить его завершиться повторно. При постоянном накоплении зомби диагностируйте родителя, который не выполняет wait, перезапустите или исправьте этого родителя подходящим эксплуатационным способом либо дайте процессу сменить родителя на способного его собрать. Большое число зомби может исчерпать ёмкость PID или таблицы процессов.

Какое описание соответствует процессу-зомби?

Осиротевшие процессы и смена родителя

Если родитель завершается, пока потомок продолжает работу, ядро передаёт потомка подходящему subreaper или процессу init соответствующего пространства имён PID. Потомок может выполняться, спать, быть остановлен или позднее стать зомби; «осиротевший» описывает потерю исходной родительской связи, а не конкретное состояние выполнения.

Принявший процесс становится ответственным за получение кода завершения. Современные диспетчеры служб и контейнерные среды не позволяют предполагать, что новым родителем всегда будет PID 1 хоста.

Что происходит, когда процесс переживает своего исходного родителя?

Урок завершён

Вы завершили Завершение процессов

Теперь вы можете отличать окончание выполнения от очистки со стороны родителя.

  • Интерпретируйте ноль как общепринятый успех, а ненулевые коды — по документации программы.

  • Используйте ожидание для получения сведений о завершении потомка.

  • Распознавайте зомби как завершившийся, но не собранный процесс.

  • Распознавайте осиротевший процесс как потомка, сменившего родителя после завершения исходного.

Сохраните прогресс

Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.

Создать бесплатный аккаунт
Следующий Урок
Назад к Процессы