1

Я приостановил 50 процессов (фон здесь), используя

kill -STOP

и затем это окно оболочки упало (возможно, проблема с графическим интерфейсом - я только что попросил конфигурацию о помощи по параметрам прокрутки), и это, казалось, заставило 50 процессов приостановить работу. (Я смог снова их приостановить).

Но почему сбой оболочки вызовет приостановку процессов? Разве они не должны оставаться на паузе, пока кто-нибудь не скажет им сделать паузу?

1 ответ1

5

В результате завершения оболочки POSIX.1-2008 требует:

Если выход из процесса приводит к тому, что группа процессов становится осиротевшей, и если какой-либо член вновь осиротевшей группы процессов остановлен, то сигнал SIGHUP, за которым следует сигнал SIGCONT, должен быть отправлен каждому процессу в вновь осиротевшей группе процессов ,

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

Предполагается, что процессы в группе процессов, выполняемые под оболочкой управления заданиями, будут управляться этой оболочкой как группой, а не пользователем, посылающим прямые сигналы SIGSTOP и SIGCONT. POSIX.1-2008 объясняет:

... если завершение процесса приводит к тому, что группа процессов становится осиротевшей, процессы внутри группы отключаются от своей оболочки управления заданиями, которая больше не имеет никакой информации о существовании группы процессов. Остановленные процессы внутри группы будут чахнуть навсегда. Чтобы избежать этой проблемы, недавно потерянные группы процессов, которые содержат остановленные процессы, отправляют сигнал SIGHUP и сигнал SIGCONT, чтобы указать, что они были отключены от своего сеанса. Сигнал SIGHUP приводит к тому, что члены группы процессов завершаются, если они не перехватывают или игнорируют SIGHUP. В большинстве случаев все участники группы процессов останавливаются, если кто-либо из них останавливается.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .