5

根据:

unix/linux“tail -f”的Java IO实现

Java "tail -f" 包装器

我认为它可能,但我有以下问题。

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)的日志,并且不打算打开它并读取整个文件。我只需要控制附加行。但是我发现没有合适的尾部实现

提前致谢。

4

1 回答 1

2

您无法从 java 内部执行管道命令。

如果您想要管道输出,请像这样执行“/bin/sh”:

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

此外,您的 java 程序必须足够快地消耗进程的输出,因此它的缓冲区不会溢出。

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

于 2013-02-11T22:49:12.357 回答