如何在复合命令中捕获stderr?

时间:2014-02-11 21:20:14

标签: java linux bash ffmpeg

假设我有一个从java代码运行的linux命令:

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

在java中我想捕获ffmpeg的stderr:

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

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

这不是关于ffmpeg,但我怎样才能确定我正在阅读ffmpeg的StdErr?

1 个答案:

答案 0 :(得分: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[])