шаги для завершения оболочки - PullRequest
0 голосов
/ 12 ноября 2018

Я прочитал главу об управлении заданиями в руководстве glibc, но мне интересно, что делать с оставшимися заданиями, когда оболочка завершается.

Я предполагаю, что следующие шаги (в соответствии с соглашением posix для обработки потерянных групп процессов первые два шага кажутся очевидными):

  • отправляет сигнал HUP заданиям с помощью sid оболочки
  • отправить сигнал ПРОДОЛЖЕНИЕ на остановленные задания с помощью sid оболочки
  • освободить ресурс, выделенный для структур данных задания

Моя проблема в том, что если рабочие места выживут?

Я думал, что шанс изменить их идентификатор сеанса, чтобы освободить sid и отсоединить группу процессов от терминала (не уверен, имеет ли это смысл)

Должен ли я сделать ioctl(STDIN_FILENO, TIOCSCTTY), чтобы процессы сеанса потеряли управляющий терминал и отправили сигналы?

Что делать с tty? Должен ли я запустить логин и установить его в качестве новой группы процессов управляющего терминала tty?

Я все еще в замешательстве, и подсказка была бы признательна.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

отправляет сигнал HUP заданиям с помощью sid оболочки

В этом нет необходимости. Ядро само отправит сигнал HUP, когда оболочка (лидер сеанса) завершится.

отправляет сигнал CONT остановленным заданиям с помощью sid оболочки

В этом нет необходимости. Ядро тоже пришлет вам это; -)

освободить ресурс, выделенный для структур данных задания

В этом тоже нет необходимости. Все ресурсы, используемые процессом, будут освобождены ядром после его завершения.

Моя проблема в том, что если рабочие места выживут?

Я думаю, вы можете SIGKILL их, если это действительно проблема. В Unix они должны выжить, если они обрабатывают SIGHUP

"Современный" systemd использует другой подход, полностью против этого духа, но я бы не стал вдаваться в это; -)

Примечания:

В Linux kill_orphaned_pgrp() из kernel/exit.c отвечает за отправку HUP + CONT на все остановленные задания из сеанса и tty_signal_session_leader() из drivers/tty/tty_jobctl.c, вызывается через tty_vhangup_session() и __tty_hangup(), которые ответственны за отправку HUP процессам из группы процессов переднего плана.

0 голосов
/ 14 ноября 2018
  • Должен ли я запустить логин и установить его в качестве новой группы процессов управляющего терминала tty?

Я прочитал и думаю, что ответ должен быть нет.

Для символьного терминала корневой процесс (initd / systemd / launchd и т. Д.) Разветвляется и исполняет getty для предварительно сконфигурированных терминалов или в конкретном событии.Getty открывает файлы терминала для чтения / записи и связывает дескрипторы файлов std с терминалом, устанавливает простую среду из файла конфигурации и запрашивает имя пользователя, а затем выполняет вход для этого имени пользователя.Вход в систему изменяет владение и права доступа для терминала, изменяет персону процесса (действующий и действительный uid, gid, группы дополнений) и исполняет оболочку входа в систему. Когда оболочка завершается, ее родительский процесс получает уведомление от sigchd и перезапускается.getty ... Так что инициализация / уничтожение tty не является задачей для оболочки ..

Пока не уверен, как обращаться с выжившими группами процессов ..

...