Является ли kill -STOP временной командой?

3483
Andrew Grimm

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

kill -STOP 

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

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

1

1 ответ на вопрос

5
mark4o

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

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

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

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

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

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

Процессы, которые я приостановил, вызывали другие скрипты ruby ​​(некоторые из которых сами называли другие скомпилированные программы на Си). Могло ли оно интерпретировать SIGHUP как относящееся к подпроцессу? (Мои скрипты не имели никакого кода для обработки сигналов, хотя) Andrew Grimm 15 лет назад 0
SIGHUP и SIGCONT будут отправлены всем процессам в группе процессов, которая включает все подпроцессы (если они не запустили свою собственную новую группу процессов или сеанс). Вы можете проверить, игнорирует ли процесс SIGHUP - в Linux grep SigIgn: / proc // статус и контрольный бит со значением 0x1; на солярисе используют psig, mark4o 15 лет назад 0