pipe & ctrl-c
От: biohumanoid  
Дата: 05.01.11 18:53
Оценка:
Скрипт(bash) A запускает по циклу программу B.
ctrl-c в скрипте замаскирован (trap ":" INT).

Убив программу по ctrl-c, в скрипте получаю код возврата, плюю в stdout (echo something).
Тут все отлично.

И тут задумалось к выводу на экран добавить вывод в файл.
./A ./B | tie 1.log

Проблема в том, что получив SIGINT, bash закрыл трубу...
И любое echo something убивает скрипт.

Как бы указать bash, что трубу закрывать по выходу из скрипта (не закрывать по ctrl-c) ?
Re: pipe & ctrl-c
От: Cyberax Марс  
Дата: 05.01.11 18:57
Оценка:
Здравствуйте, biohumanoid, Вы писали:

B>Как бы указать bash, что трубу закрывать по выходу из скрипта (не закрывать по ctrl-c) ?

Как-то так:
trap "/bin/false" INT
trap "/bin/false" TERM
Sapienti sat!
Re[2]: pipe & ctrl-c
От: biohumanoid  
Дата: 05.01.11 20:27
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, biohumanoid, Вы писали:


B>>Как бы указать bash, что трубу закрывать по выходу из скрипта (не закрывать по ctrl-c) ?

C>Как-то так:
C>
C>trap "/bin/false" INT
C>trap "/bin/false" TERM
C>


Неа, труба закрывается на ctrl-c.
==
#!/bin/sh

trap "/bin/false" INT
trap "/bin/false" TERM

sleep 10

ps aufx > a
echo 123
ps aufx > b
==
bash a.sh | tee

ctrl-c, файл b даже не появляется...
Re: pipe & ctrl-c
От: dilmah США  
Дата: 05.01.11 20:32
Оценка:
B>И тут задумалось к выводу на экран добавить вывод в файл.
B>./A ./B | tie 1.log

перемести єто внутрь скрипта
Re[2]: pipe & ctrl-c
От: biohumanoid  
Дата: 05.01.11 20:49
Оценка:
Здравствуйте, dilmah, Вы писали:

B>>И тут задумалось к выводу на экран добавить вывод в файл.

B>>./A ./B | tie 1.log

D>перемести єто внутрь скрипта


Это, в смысле | tie воткнуть в каждом месте, где есть вывод ?
Мест много...
Re[3]: pipe & ctrl-c
От: Cyberax Марс  
Дата: 05.01.11 20:51
Оценка:
Здравствуйте, biohumanoid, Вы писали:

B>bash a.sh | tee

B>ctrl-c, файл b даже не появляется...
Это надо делать в том скрипте, в котором рвётся труба.
Sapienti sat!
Re[3]: pipe & ctrl-c
От: dilmah США  
Дата: 05.01.11 20:59
Оценка:
B>Это, в смысле | tie воткнуть в каждом месте, где есть вывод ?
B>Мест много...

ээ.. а ты шелл знаешь то вообще?

скорее всего твой скрипт выглядит так:
где-то объявляются функции и где-то идет само тело скрипта.
Вот это тело ты можешь окружить в скобки:

{
  тело скрипта
} | tee 1.log



Еще один вариант позволяющий не индентировать тело скрипта:MYFIFO=$(mktemp /tmp/myfifo.XXXXXX)

trap 'rm -f $MYFIFO' 0
rm -f $MYFIFO
mkfifo $MYFIFO
tee 1.log < $MYFIFO &
exec > $MYFIFO

тело скрипта




P.S.
tee not tie
Re[4]: pipe & ctrl-c
От: biohumanoid  
Дата: 05.01.11 21:05
Оценка:
D>ээ.. а ты шелл знаешь то вообще?
Местами.

D>скорее всего твой скрипт выглядит так:

Я написал пример выше.
==a.sh
#!/bin/sh

trap "/bin/false" INT
trap "/bin/false" TERM

sleep 10

ps aufx > a
echo 123
ps aufx > b
==
bash a.sh | tee

ctrl-c, файл b даже не появляется...

т.е. скрипт a.sh не умирает от ctrl-c, sleep умирает.
Но к моменту "ps aufx > a" tee уже убит...

Можно конечно скрипту a.sh передать a.log, и везде где есть вывод воткнуть |tee $1, но это как то...
Re[5]: pipe & ctrl-c
От: RedUser Россия  
Дата: 07.01.11 12:20
Оценка:
B>т.е. скрипт a.sh не умирает от ctrl-c, sleep умирает.
B>Но к моменту "ps aufx > a" tee уже убит...

Насколько я понял из man`а, SIGINT посылается всем входящим в состав конвейера процессам.
http://www.opennet.ru/man.shtml?topic=bash&amp;category=1&amp;russian=0

Для упрощения реализации пользовательского интерфейса для управления заданиями система поддерживает понятие идентификатора группы процессов текущего терминала. Члены этой группы процессов (процессы, идентификатор группы процессов которых равен идентификатору группы процессов терминала) получают сигналы с клавиатуры, например, сигнал SIGINT.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.