重定向Bash子脚本的输出

时间:2011-12-21 18:18:50

标签: linux bash shell command-line

我有一个输出各种状态消息的基本脚本。 e.g。

~$ ./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来检查日志时,我什么都看不见,即使运行顶级节目myscript.sh当前正在执行,因此可能会输出状态消息。

为什么在父日志中没有捕获子脚本中的stdout / stderr?我该如何解决这个问题?

编辑:我也在远程计算机上运行这些程序,通过使用伪tty分配的ssh连接,例如ssh -t user@host。伪tty会干扰吗?

2 个答案:

答案 0 :(得分: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结束时发送的电子邮件中的整个输出吗?只是当流程运行时你没有看到输出?

答案 1 :(得分:1)

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

请注意,在旧式Unix平台中,unbuffer并不总是作为std二进制文件提供,并且可能需要搜索和安装包来支持它。

我希望这会有所帮助。