3 回答
TA貢獻1813條經驗 獲得超2個贊
你想要的把戲?
不要從ProcessBuilder.start()啟動過程。不要試圖弄亂Java的流重定向/消耗(特別是如果您不提供任何有關的信息;)
使用ProcessBuilder.start()啟動一個小的shell腳本,吞噬所有輸入/輸出流。
像這樣:
#!/bin/bash
nohup $1 >/dev/null 2>error.log &
那就是:如果您不關心stdout,仍然想將stderr(對嗎?)記錄到文件中(請在error.log此處)。
如果您甚至不關心stderr,只需將其重定向到stdout即可:
#!/bin/bash
nohup $1 >/dev/null 2>1 &
然后,您從Java調用了這個小腳本,將要運行的進程的名稱作為參數提供給它。
如果在Linux上運行的同時將stdout和stderr都重定向到/ dev / null的進程仍然產生任何東西,則說明您的Linux安裝不合要求;)
換句話說:上面的Just Works?擺脫了有問題的“您需要按此順序使用流,并且按順序使用Java特定的廢話”。
TA貢獻1834條經驗 獲得超8個贊
如果運行進程的線程不處理輸出,則該線程可能會阻塞。這可以通過產生一個讀取進程輸出的新線程來完成。
final ProcessBuilder builder = new ProcessBuilder("script")
.redirectErrorStream(true)
.directory(workDirectory);
final Process process = builder.start();
final StringWriter writer = new StringWriter();
new Thread(new Runnable() {
public void run() {
IOUtils.copy(process.getInputStream(), writer);
}
}).start();
final int exitValue = process.waitFor();
final String processOutput = writer.toString();
添加回答
舉報
