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