2016-10-04 84 views
0

在bash腳本中,我想顯示另一個腳本的輸出,其中的執行時間很長,哪些輸出(包含進度欄)會重定向到文件。如何在循環中使用尾部-f

我推出了使用tail -f的想法,而我啓動的過程仍在運行。


虛擬試:

#!/bin/bash 
./worker.sh & # will log in LOG file 
while [[ $(kill -0 $!) ]]; do # my implementation of ps does not support the -p option 
    tail -f LOG 
done 
... 

這並不爲tail 「掛起」 工作。


我找到了一個解決方法使用以下,但我敢肯定,還有另一種更簡潔的方案:

#!/bin/bash 
./worker && pkill tail & # I assumed that worker will always return 0 
tail -f LOG 
... 

所以,我的問題是:什麼是要顯示的最佳方式正在運行的進程的輸出在不等待它完成的情況下登錄到文件中?

+0

在循環中運行'tail -f'的目的是什麼?當使用'-f'標誌時,'tail'命令將在文件更新時繼續顯示。 –

+0

事實上,這是一個愚蠢的想法 – Zermingore

回答

1

我想你已經做了正確的方式,但你不應該使用&&,因爲事實上,如果./worker失敗,則tail進程將永遠不會終止。我找到了完美的回答

#!/bin/bash 
./worker ; pkill tail & 
tail -f LOG 
+0

我目前正在使用'(./worker; pkill尾巴)&'如你所說。不幸的是,我不能接受你的答案,因爲我真的相信'--pid'更合適(如果在執行worker時,另一個進程開始使用'tail',會發生什麼?) 感謝您的幫助 – Zermingore

1

:相反,你可以在命令與;分開,如

tail有--pid選項:

--pid=PID 
    with -f, terminate after process ID, PID dies 

所以腳本如下:

#!/bin/bash 
./worker.sh & # will log in LOG file 
tail -f --pid=$! LOG 

不幸的是,至少我的tail(busybox 1.16.1)的實現不支持這個選項,所以我仍然打開解決方法。

+0

如何:1 )得到./worker的PID1。 2)在後臺運行'tail -f',並獲得它的PID2。 3)使用'等待'等待工人完成。 4)'kill ' –

+0

@ this.lau_謝謝你,它完美的作品。你可以合併我們的答案+你的評論,以便我可以接受你的答案? – Zermingore