_ RU.UNIX (2:5077/15.22) _____________________________________________ RU.UNIX _
From : Anthony Solovjoff 2:5030/168 13 Aug 98 22:07:10
Subj : Q Hint
________________________________________________________________________________
Hi Andrew!
13 Aug 98, Andrew Kaminski writes to All:
AK> Так почему пеpвый if из /etc/rc2 отpабатывает без пpоблем и tee
AK> завеpшается а во втоpом if он болтается себе и пока его не убьеш rc2
AK> до конца не отpаботает ? Я конечно убpал это "| $LOGCMD" но может
AK> пpичина в одном и томже ? До patcha этого там не было.
Тут вроде все просто. Упростим:
s1:
===
:
#
s2 2>&1 | tee $LOG
exit 0
===
s2:
===
:
#
while true
do
sleep 5
echo Hi!
done &
exit 0
===
Итак. Происходит следующее шелл выполняет скрипт s1, встречает вызов s2,
форкается дважды, делает pipe(), делает fdup() в обеих потомках, так, чтобы один
конец трубы у одного потомка стал стандартным выходом, а другой конец трубы у
другого потомка стандартным входом. И дальше родитель (выполняющий s1) ждет
заврешения всех потомков, которые породил при исполнении s1 2>&1 | tee $LOG.
Шелл, выполняющий s2 порождает из под себя цикл (или любую др. программу), эта
программа наследует от шелла открытые декрипторы. И хотя там стоит & и шелл,
выполняющий s2, завершается, порожденная им программа (цикл) продолжает держать
свои вход/выход открытыми. Заметим, что ее выход является входом пайпа к tee.
Итак канал к tee _не_ закрыт. tee _не_ получает EOF и не заврешается.
Соответственно, мы видим висящий цикл, висящий tee, и первый шелл, который
выполняет s1 и ждет завершения всех членов запущенной трубы. Уффф!
\ 0<
(A)
|
--- GoldED 2.51.A1026 UNREG
* Origin: The Clockwork Mailman, 7(812)174-1763, CM (2:5030/168)
605 Прочтений • [Q Hint (pipe fs)] [08.05.2012] [Комментариев: 0]