Как фоновый скрипт bash может выйти из работающей оболочки?

Запуск скрипта bash в фоновом режиме с включенным управлением заданиями и закрытым стандартным вводом приведет к выходу из оболочки PARENT. Как это может случиться?

Чтобы продемонстрировать, сделайте это background_bash_script:

#!/bin/bash
set -m
ruby -e "puts :here"

Затем запустите его в bash - он выйдет из оболочки, в которой вы его запустили. Команда ruby ​​не имеет значения, хотя кажется, что это должна быть команда, а не встроенная bash (например, awk --version работает, а true нет). Чтобы лучше рассмотреть, я запускал его в еще одном экземпляре bash. Полная сессия выглядит так.

parent: PS1='child: ' bash
child: ./background_bash_script <&- &
[1] 3893
child: here
exit
parent:

Сбивает с толку!


person Simon Chiang    schedule 04.09.2013    source источник
comment
Я получаю такое поведение даже без закрытия стандартного ввода.   -  person Vaughn Cato    schedule 04.09.2013
comment
Вы когда-нибудь запускали trap exit CHLD? :)   -  person dannysauer    schedule 04.09.2013
comment
@dannysauer - ха, нет. Никаких самодельных забавных дел :)   -  person Simon Chiang    schedule 04.09.2013


Ответы (1)


Похоже, что происходит то, что после того, как set -m запускается в сценарии, следующая выполняемая команда принудительно находится в группе процессов переднего плана, что выводит исходную оболочку из группы процессов переднего плана. После завершения этого процесса оболочка, выполняющая сценарий, теперь находится в группе процессов переднего плана, но после выхода из этой оболочки исходная оболочка не возвращается в группу процессов переднего плана, поскольку она запускала сценарий в фоновом режиме. Итак, теперь у вас есть интерактивная оболочка, которая находится в группе фоновых процессов.

Здесь вы можете увидеть какое-то странное поведение, если вы поместите сон в конец вашего скрипта, чтобы он не завершился немедленно. Когда вы запускаете сценарий в фоновом режиме, вы снова получаете приглашение терминала, но теперь ваша интерактивная оболочка не находится в группе процессов переднего плана! Как только вы попытаетесь ввести что-либо, оболочка закроется. Я не уверен, какой именно механизм вызывает выход. Поскольку оболочка работает в фоновом режиме, любые попытки чтения или записи символов в терминал должны приводить к SIGTTIN OR SIGTTOU, но эти сигналы не приводят к завершению работы оболочки в моих тестах.

person Vaughn Cato    schedule 04.09.2013
comment
Ваузеры. Не знаю, как вы это поняли, но вполне возможно. Вы проводили расследование с закрытым стандартным вводом? Возможно, когда дочерняя оболочка находится на переднем плане и выходит, родитель выходит вперед, но повторно подключает дочерний стандартный ввод (который закрыт). Может быть, родитель выходит, потому что он получает закрытый стандартный ввод? - person Simon Chiang; 04.09.2013
comment
@SimonChiang: я не нашел релевантным закрытие стандартного ввода. Я использую Linux и проверил содержимое /proc/[pid]/stat для получения информации о сеансе, группах процессов и т. д. - person Vaughn Cato; 04.09.2013