2011-12-21 178 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結尾發送的電子郵件中的整個輸出嗎?只是當流程運行時,你沒有看到輸出?