Скрипт(bash) A запускает по циклу программу B.
ctrl-c в скрипте замаскирован (trap ":" INT).
Убив программу по ctrl-c, в скрипте получаю код возврата, плюю в stdout (echo something).
Тут все отлично.
И тут задумалось к выводу на экран добавить вывод в файл.
./A ./B | tie 1.log
Проблема в том, что получив SIGINT, bash закрыл трубу...
И любое echo something убивает скрипт.
Как бы указать bash, что трубу закрывать по выходу из скрипта (не закрывать по ctrl-c) ?
От:
Cyberax
Дата: 05.01.11 18:57
Оценка:
Здравствуйте, biohumanoid, Вы писали:
B>Как бы указать bash, что трубу закрывать по выходу из скрипта (не закрывать по ctrl-c) ?
Как-то так:
trap "/bin/false" INT
trap "/bin/false" TERM
Sapienti sat!
Здравствуйте, 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 даже не появляется...
От:
dilmah
Дата: 05.01.11 20:32
Оценка:
B>И тут задумалось к выводу на экран добавить вывод в файл.
B>./A ./B | tie 1.log
перемести єто внутрь скрипта
Здравствуйте, dilmah, Вы писали:
B>>И тут задумалось к выводу на экран добавить вывод в файл.
B>>./A ./B | tie 1.log
D>перемести єто внутрь скрипта
Это, в смысле | tie воткнуть в каждом месте, где есть вывод ?
Мест много...
От:
Cyberax
Дата: 05.01.11 20:51
Оценка:
Здравствуйте, biohumanoid, Вы писали:
B>bash a.sh | tee
B>ctrl-c, файл b даже не появляется...
Это надо делать в том скрипте, в котором рвётся труба.
Sapienti sat!
От:
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
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, но это как то...
От:
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&category=1&russian=0
Для упрощения реализации пользовательского интерфейса для управления заданиями система поддерживает понятие идентификатора группы процессов текущего терминала. Члены этой группы процессов (процессы, идентификатор группы процессов которых равен идентификатору группы процессов терминала) получают сигналы с клавиатуры, например, сигнал SIGINT.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить