2013-12-18 81 views
0

我有一個程序,有一個窗口,也輸出到標準輸出。我正在讀取程序輸出並將一行輸出寫入管道。這是在程序仍在運行時在後臺完成的。我發送一個命令到窗口並等待grep中的單行。然而,即使程序已經產生了這個文本尾巴也不會退出unitl,我停止了這個程序。從後臺進程的命名管道讀取

我想尾巴儘快返回這一行,所以我可以用「\ e」來終止程序到窗口。

bin/Prog | grep "TEXT" > /tmp/pipe2 & 
xvkbd -window Window -text "2" 
tail -n1 /tmp/pipe2 >> out.t 
xvkbd -window Window -text "\e" 

回答

2

tail命令不知道它已經達到了輸入的最後一行,直到它得到EOF,它不會得到EOF直到grep終止並關閉其標準輸出。另外,grep將在輸出設備不是「交互式」時緩衝其輸出,並且命名管道不是「交互式」,因此grep的輸出將不會寫入管道,直到其輸入生成EOF爲止直到bin/Prog退出。因此,在程序退出之前,greptail卡住了,並且因爲您在等待greptail在退出程序之前退出,您會遇到死鎖。

您可能會用tail -n +1做的更好,它會在起始處尋找一行輸出(或sed 1qhead -n 1或...)。但是,您仍然堅持使用grep緩衝其輸出,這會讓您處於困境。

+0

將一堆「stdbuf -i0 -o0 -e0」添加到我的腳本中並沒有幫助。這與你所說的一致嗎? – e2e8

+0

我以前沒有遇到['stdbuf'](http://www.gnu.org/software/coreutils/manual/html_node/stdbuf-invocation.html)。我不確定我什至看到它是如何工作的;我不會期望初始化進程設置的緩衝模式會影響它執行的進程的緩衝。鑑於此,我不確定您所看到的行爲是否與此一致。我期望它是,但我坦率地不確定。 –