2011-12-21 4 views
1

У меня есть базовый скрипт, который выводит различные сообщения о статусе. напримерПеренаправление вывода дочерних скриптов Bash

~$ ./myscript.sh 
0 of 100 
1 of 100 
2 of 100 
... 

Я хотел, чтобы обернуть это в родительском сценарии для того, чтобы запустить последовательность детей-скрипты и отправить по электронной почте на общее завершение, например topscript.sh

#!/bin/bash 
START=$(date +%s) 
/usr/local/bin/myscript.sh 
/usr/local/bin/otherscript.sh 
/usr/local/bin/anotherscript.sh 
RET=$? 
END=$(date +%s) 
echo -e "Subject:Task Complete\nBegan on $START and finished at $END and exited with status $RET.\n" | sendmail -v [email protected] 

Я бегу это как:

~$ topscript.sh >/var/log/topscript.log 2>&1 

Однако, когда я бегу tail -f /var/log/topscript.log осмотреть журнал я не вижу ничего, даже если работает сверху показывает myscript.sh в настоящее время выполняется , и, следовательно, предположительно выводят сообщения о состоянии.

Почему не записывается stdout/stderr из дочерних скриптов в журнал родителя? Как это исправить?

EDIT: Я также запускаю их на удаленной машине, подключенной через ssh, используя распределение псевдо-tty, например. ssh -t [email protected]. Может ли псевдо-tty вмешиваться?

+1

Если нижеприведенный ниже ответ не поможет, вы можете попытаться сузить место, где это происходит неправильно. Некоторые вещи, которые нужно попробовать: (1) Записывает ли './myscript.sh> tmp.log 2> & 1'' 'tmp.log'? Если нет, возможно, это проверка '[[-t 1]]' и только запись сообщений, когда стандартный вывод является TTY. (2) По завершении 'topscript.sh' вы видите сообщения в журнале? (Другими словами, разве это задержка? Это то, что предлагают убежище и ответы только одного). – ruakh

ответ

1

попробовать

unbuffer topscript.sh >/var/log/topscript.log 2>&1 

Обратите внимание, что unbuffer не всегда доступен как станд двоичном в старом стиле Unix платформ и может потребовать поиска и установки для пакета, чтобы поддержать его.

Надеюсь, это поможет.

2

Я просто попытался ваш следующее: У меня есть три файла t1.sh, t2.sh и t3.sh все со следующим содержанием:

#!/bin/bash 

for((i=0;i<10;i++)) ; do 
    echo $i of 9 
    sleep 1 
done 

и скрипт называется myscript.sh со следующим содержание:

#!/bin/bash 

./t1.sh 
./t2.sh 
./t3.sh 

echo "All Done" 

Когда я бегу ./myscript.sh > topscript.log 2>&1, а затем в другом терминале перспективе tail -f topscript.log я вижу линии выводящиеся просто отлично в файле журнала.

Возможно, что вещи, выполняемые в ваших индексах, используют большой выходной буфер? Я знаю, что раньше я запускал сценарии python, у него есть довольно большой выходной буфер, поэтому вы не видите какой-либо вывод на некоторое время. Вы действительно видите весь вывод в электронной почте, который отправляется в конце topscript.sh? Это просто, что во время процессов вы не видите результат?

Смежные вопросы