2013-04-18 23 views
1

我有一個寫入標準輸出的過程,我希望能夠在運行尾部-f時通過對各種字符串進行刷新來監視輸出。做到這一點的一種方法是寫入一個普通文件,然後尾隨文件grepping一個字符串,然後尾巴grep爲另一個。但是,我不想寫入文件,因爲這會填滿磁盤,而且我不想處理旋轉日誌文件的麻煩。在bash中,如何找出當前正在寫入的fifo,然後再次結束fifo,尋找不同的文本?

我以爲我可以使用fifos來實現這一點。例如,

mkfifo myfifo 
foo > myfifo & 
tail -f myfifo | grep bar 
tail -f myfifo | grep baz 

不幸的是,這似乎並不奏效。實際上,當我第一次執行tail -f myfifo然後foo > mfifo時,我看到任何輸出的唯一方法,但我不想重新啓動foo(這是整個要點,否則我可以直接grep標準輸出並重新啓動進程grep爲不同的字符串)。有誰知道爲什麼會發生這種情況,或者有關於如何實現這一點的建議?

+0

是爲[Linux的無阻塞FIFO的解決方案(按需日誌記錄)](http://stackoverflow.com/q/7360473/95735)你想要的東西? –

回答

4

發生這種情況,因爲fifo is a data stream玩。從FIFO中讀取一段數據後,它將從FIFO中移出。在您的情況下,存儲在myfifo中的foo的輸出正在被第一個tail -f讀取爲grep s爲「bar」,而第二個tail -f沒有任何記錄。

但是,您不需要將foo的輸出發送到文件(FIFO或其他)。你可以發送它的輸出directly into tee and have it send that output to as many processes as you want。例如:

$ foo | tee >(grep -o bar) >(grep -o baz) >/dev/null 

或者,如果你只是使用grep,你可以使用-e多次,只要你想在輸出:

$ foo | grep -e bar -e baz 
+0

+1謝謝,這是有用的,但在我的情況下,我不一定知道我會事先想好什麼。我希望做的事情是,當我看到我想要提出的某些東西時,可以通過一種方式來清除長時間運行的過程的輸出。關於您對fifo是數據流這一事實的評論,是否會阻止其在第一個讀取器被殺死後被另一個進程讀取(例如,tail -f foo | grep bar -C tail -f foo | grep巴茲)? – jonderry

0

您可以使用不同的grep語法:

tail -f myfifo | grep -e 'pattern1' -e 'pattern2' -e 'pattern3' 

我想你想既要在同一時間出現在同一輸出流,對不對?

否則,你可以用發球

tail -f myfifo | tee -a somefile | grep bar 
grep foo somefile