Перенаправление вывода дочерних скриптов Bash - PullRequest
1 голос
/ 21 декабря 2011

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

~$ ./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 group@mydomain.com

Я запускаю это как:

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

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

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

РЕДАКТИРОВАТЬ: Я также запускаю их на удаленной машине, подключенной через ssh с использованием псевдо-tty распределения, например, ssh -t user@host.Может ли псевдо-tty вмешиваться?

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Я только что попробовал следующее: у меня есть три файла 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?Просто во время работы процессов вы не видите вывод?

1 голос
/ 21 декабря 2011

1001 * попробовать *

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...