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

Java 如何在复合命令中捕获stderr?,java,linux,bash,ffmpeg,Java,Linux,Bash,Ffmpeg,假设我有一个从java代码运行的linux命令: /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(proc

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

/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无关,但如何确保我正在阅读ffmpeg的StdErr?

在这种情况下,Java将取代bash作为流程管理器。与bash在后台启动流程并编写pid文件不同,您可以让Java在后台启动流程,并可以选择通过
流程
实例对其进行控制

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();
    ...
}
如果您以后想杀死它,例如,使用
process.destroy()
而不是
kill$(

注意:永远不要使用
Runtime.exec(字符串)
。它很容易出错,根本不像C的
系统(3)
。始终使用
Runtime.exec(字符串[])

process.destroy()
并不总是足以杀死正在发送SIGTERM的ffmpeg。大多数情况下,杀死ffmpeg的最佳方法是kill-9(SIGKILL)。