2013-02-11 93 views
4

据:是否可以将“tail -f”命令输出到java程序?

Java IO implementation of unix/linux "tail -f"

Java "tail -f" wrapper

我承担其可能的,但我有以下问题。

String TailCommand = "tail -f /path/PATH.txt| grep (...)"; 
Runtime r = Runtime.getRuntime(); 
Process p = r.exec(TailCommand); 

//handle buffer 

while (running) { 
    // handle output 
} 

过程p结束。它不会像“top”或“tail -f”那样有不断更新的命令。

我不知道我是否错过了某些东西,有一些缓冲区限制或什么? 即时通讯使用eclipse,但我想这应该不会对流程行为有任何影响。

事实上,也许有另一种简单的方法来解决我错过的问题。我使用“tail -f”,因为我必须分析相当胖(一些GB)的日志,这些日志不断附加,并不打算打开它并阅读整个文件。我只需要控制附加行。但我发现没有合适的尾部实施

在此先感谢。

+0

我假设你想要'-f'“跟随”行为?那尾巴永远不会结束? – 2013-02-11 22:44:53

+0

是的,多数民众赞成 – 2013-02-11 22:58:19

回答

2

您不能从java内部执行管道命令。

如果你想管道输出,执行“/ bin/sh的”这样的:

String tailCommand = "/bin/sh -c 'tail -f /path/PATH.txt| grep (...)'"; 

此外,Java程序必须使用的过程足够快的输出,所以它的缓冲器不会溢出。

您可能想要阅读此文章When Runtime.exec() won't,以了解尝试从Java执行进程时常见的缺陷。

+1

+1 - 虽然,管道不会“溢出”。相反,如果您的Java应用程序没有足够快地读取输出,则外部命令将在写入其各自输出管道的位置停止。 – 2013-02-11 22:56:53

+0

谢谢,它的作品。至少部分...管道配合不会更新的命令。例如:“tail FILE | grep whatever” - 工作,“tail -f FILE”(无管道) - 工作,“tail -f FILE | grep whatever” - 没有数据(进程不会死亡)。 – 2013-02-13 16:21:26

+0

嘿@AbecedeAbecede,你解决了关于“tail -f test.log | grep abc”的问题吗?我正在考虑 - 无法从这种命令中获得任何输出 – Alexis 2015-07-09 10:12:37