2014-02-12 49 views
0

下面是代碼:在Java中執行linux終端命令,涉及寫入日誌文件,但沒有權限?

String cmd = "/usr/local/postgresql/bin/postgres -D /usr/local/postgresql/data >logfile 2>&1 &"; 
Process p = Runtime.getRuntime().exec(cmd); 

它不工作。該命令應該啓動postgres服務器,但我檢查了服務器沒有啓動,這意味着命令沒有執行。但它的工作,如果命令是這樣的:/usr/local/postgresql/bin/postgres -D /usr/local/postgresql/data只是啓動服務器,但不需要寫入日誌文件。

所以我猜這個命令中的字符可能是個問題。我試過這個solution。它仍然沒有工作。然後我意識到也許這是權限問題?我的意思是java文件沒有寫入日誌文件的權限?但我不知道如何解決這個問題。任何建議?提前致謝。

回答

0

在C#中,我們能夠獲得控制檯和錯誤流的句柄,然後對他們做我們喜歡的事情。

而不是「>日誌文件...」,你能得到從p輸出流的句柄,然後以編程方式寫入您的日誌文件?

與「&」相同。您的Process API可能有一種方法將其置於後臺。

要排除權限,請將上例中的「logfile」更改爲「/tmp/mytemporarylogfile.txt」之類的內容,並查看是否有幫助。 (我懷疑這是否會因爲我不認爲它在Java內部喜歡你的shell結構的「>」,「2> & 1」和「&」,想象一下,如果你在Windows上運行它,它會做什麼。)

0

您可以使用方法Process.getErrorStream()來獲取錯誤流,並使用此方法將其內容存入文件中。更容易,似乎ProcessBuilder類有一個方法將輸出重定向到一個文件ProcessBuilder.redirectOutput()

但是,我不認爲有一種方法可以在後臺執行該命令。這在shell中有意義,但在Java中?

0

使用'>'操作符重定向到文件是shell的一個功能,而不是操作系統固有的東西。您可能需要生成一個運行該進程的shell,或者讀取進程的輸出並將其寫入Java的日誌文件。

相關問題