Сигналы
Когда Bash работает в интерактивном режиме и обработчики не установлены, он игнорирует SIGTERM (поэтому «kill 0» не завершает интерактивную оболочку) и перехватывает и обрабатывает SIGINT (поэтому встроенная команда wait может быть прервана). Когда Bash получает SIGINT, он прерывает все выполняющиеся циклы. Во всех случаях Bash игнорирует SIGQUIT. Если включено управление заданиями (см. Управление заданиями), Bash игнорирует SIGTTIN, SIGTTOU и SIGTSTP.
Встроенная команда trap изменяет обработку сигналов оболочкой, как описано ниже (см. Встроенные команды Bourne Shell.
Для внешних команд, запускаемых Bash, обработчики сигналов устанавливаются в значения, унаследованные оболочкой от родительского процесса, если только trap не устанавливает их в состояние игнорирования; в этом случае дочерний процесс также будет их игнорировать. Если управление заданиями не включено, асинхронные команды, помимо этих унаследованных обработчиков, игнорируют 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 не включает управление заданиями, если оболочка работает не в интерактивном режиме, такая ситуация чаще всего возникает в неинтерактивных оболочках.
Когда управление заданиями включено и Bash ожидает завершения команды переднего плана, оболочка не получает генерируемые с клавиатуры сигналы, поскольку она не входит в ту же группу процессов, что и терминал. Такая ситуация чаще всего возникает в интерактивных оболочках, где Bash пытается включить управление заданиями по умолчанию. Более подробное обсуждение групп процессов см. в разделе Управление заданиями.
Когда управление заданиями не включено и Bash получает SIGINT во время ожидания команды переднего плана, он ждёт завершения этой команды, а затем решает, что делать с SIGINT:
- Если команда завершается из-за
SIGINT, Bash заключает, что пользователь намеревался отправитьSIGINTи оболочке, и обрабатываетSIGINT(например, выполняя обработчикSIGINT, завершая неинтерактивную оболочку или возвращаясь на верхний уровень для чтения новой команды). - Если команда не завершается из-за
SIGINT, программа обработалаSIGINTсамостоятельно и не сочла его фатальным сигналом. В этом случае Bash также не считаетSIGINTфатальным сигналом, предполагая, чтоSIGINTиспользовался как часть обычной работы программы (например,emacsиспользует его для отмены команд редактирования) или был намеренно отброшен. Однако для совместимости Bash выполнит любой обработчик, установленный дляSIGINT, как и для любого другого перехваченного сигнала, полученного во время ожидания завершения команды переднего плана.
Когда управление заданиями включено, Bash не получает генерируемые с клавиатуры сигналы, такие как SIGINT, во время ожидания команды переднего плана. Интерактивная оболочка не обращает внимания на SIGINT, даже если команда переднего плана завершается в результате его получения, а лишь фиксирует её код завершения. Если оболочка работает не в интерактивном режиме и команда переднего плана завершается из-за SIGINT, Bash для совместимости ведёт себя так, будто сам получил SIGINT (сценарий 1 выше).
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