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

Изпълнението на bash скрипт във фонов режим с активиран контрол на заданието и затворен stdin ще излезе от обвивката 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
Получавам това поведение дори без затваряне на stdin.   -  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 ИЛИ SIGTTOU, но тези сигнали не карат черупката да излезе от моите тестове.

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