2013-04-18 27 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