2013-02-11 72 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

相關問題