2014-02-11 45 views
0

說我有從Java代碼運行的是Linux命令:如何在複合命令中捕獲stderr?

/bin/bash -c nice -n 8 ffmpeg {params of ffmpeg} & echo $! > ffmpeg.pid 

在java中我要趕標準錯誤的ffmpeg:

Process process = Runtime.getRuntime().exec(command); 

BufferedReader input = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
while (...) { 
    String ffmpegStdErrLine = input.readLine(); 
    ... 
} 

這不是關於ffmpeg的,但我怎麼能保證我m閱讀ffmpeg的StdErr?

回答

0

在這種情況下,Java會將bash替換爲進程管理器。不是讓bash在後臺啓動進程並編寫pid文件,而是讓Java在後臺啓動進程並通過Process實例控制它。

Process process = 
    Runtime.getRuntime().exec(new String[] { "nice", "-n", "8", "ffmpeg", "-i", "file.avi", "output.avi" }); 

BufferedReader input = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
while (...) { 
    String ffmpegStdErrLine = input.readLine(); 
    ... 
} 

如果你以後想要例如殺了它,而不是kill $(< ffmpeg.pid),你會使用process.destroy()

PS:切勿使用Runtime.exec(String)。這很容易出錯,並不像C的system(3)。始終使用Runtime.exec(String[])

+0

'process.destroy()'並不總是足以在發送SIGTERM時殺死ffmpeg。大多數情況下殺死ffmpeg的最好方法是kill -9(SIGKILL)。 –

相關問題