2011-12-21 216 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?我该如何解决?

编辑:我也在远程计算机上运行这些,通过ssh使用伪tty分配连接,例如, ssh -t [email protected]。伪tty可能会干扰?

+1

如果下面的避难所的答案没有帮助,你可能想尝试缩小发生错误的地方。有些事情要尝试:(1)./myscript.sh> tmp.log 2>&1'是否写入'tmp.log'?如果不是,可能是检查'[[-t 1]]',并且只在标准输出是TTY时才写消息。 (2)'topscript.sh'完成后,你看到日志中的消息吗? (换句话说,这只是他们被推迟了吗?这是庇护所,只有一个人的答案都暗示。) – ruakh 2011-12-21 18:33:21

回答

1

尝试

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

注意,无缓冲并不总是可作为旧式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结尾发送的电子邮件中的整个输出吗?只是当流程运行时,你没有看到输出?