Spec-Zone.ru › Bash

Сигналы

Когда Bash интерактивный, в отсутствие ловушек, он игнорирует SIGTERM (чтобы «kill 0» не убивало интерактивную оболочку), и SIGINT перехватывается и обрабатывается (чтобы встроенная команда wait была прерывимой). Когда Bash получает SIGINT, он выходит из всех выполняемых циклов. Во всех случаях Bash игнорирует SIGQUIT. Если управление заданиями включено (см. Управление заданиями), Bash игнорирует SIGTTIN, SIGTTOU, и SIGTSTP.

Невстроенные команды, запущенные Bash, имеют обработчики сигналов, установленные в значения, унаследованные оболочкой от родительского процесса. Когда управление заданиями не включено, асинхронные команды игнорируют SIGINT и SIGQUIT помимо унаследованных обработчиков. Команды, запущенные в результате подстановки команд, игнорируют генерируемые клавиатурой сигналы управления заданиями SIGTTIN, SIGTTOU, и SIGTSTP.

Оболочка по умолчанию завершается при получении SIGHUP. Перед завершением интерактивная оболочка отправляет SIGHUP всем заданиям, работающим или приостановленным. Приостановленным заданиям отправляется SIGCONT, чтобы убедиться, что они получат SIGHUP. Чтобы предотвратить отправку оболочкой сигнала SIGHUP конкретному заданию, его следует удалить из таблицы заданий с помощью встроенной команды disown (см. Встроенные команды управления заданиями) или отметить, чтобы оно не получало SIGHUP с помощью disown -h.

Если параметр оболочки huponexit был установлен с помощью shopt (см. Встроенная команда Shopt), Bash отправляет SIGHUP всем заданиям при завершении интерактивной входной оболочки.

Если Bash ожидает завершения команды и получает сигнал, для которого установлена ловушка, ловушка не будет выполнена до завершения команды. Когда Bash ожидает асинхронную команду через встроенную команду wait, получение сигнала, для которого установлена ловушка, заставит встроенную команду wait возвратиться немедленно со статусом выхода больше 128, сразу после чего выполнится ловушка.

Когда управление заданиями отключено, и Bash ожидает завершения команды в фоновом режиме, оболочка получает генерируемые клавиатурой сигналы, такие как SIGINT (обычно генерируемый «^C»), которые пользователи обычно намерены отправить этой команде. Это происходит потому, что оболочка и команда находятся в одной группе процессов с терминалом, и «^C» отправляет SIGINT всем процессам в этой группе процессов. См. Управление заданиями для более подробного обсуждения групп процессов.

Когда Bash работает без управления заданиями и получает SIGINT в ожидании завершения команды в фоновом режиме, он ждет завершения этой команды в фоновом режиме, а затем решает, что делать с SIGINT:

  1. Если команда завершается из-за SIGINT, Bash заключает, что пользователь хотел завершить весь скрипт, и действует в соответствии с SIGINT (например, выполняя ловушку SIGINT или завершая себя);
  2. Если командная цепочка не завершается из-за SIGINT, программа обработала SIGINT сама и не считала её фатальным сигналом. В этом случае Bash также не рассматривает SIGINT как фатальный сигнал, предполагая, что SIGINT использовался в рамках обычной работы программы (например, emacs использует его для прерывания команд редактирования) или преднамеренно отброшен. Однако Bash выполнит любую ловушку, установленную на SIGINT, как и с любым другим перехваченным сигналом, полученным им во время ожидания завершения команды в фоновом режиме, для обеспечения совместимости.

Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/bash/manual/html_node/Signals.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API