如何在复合命令中捕获 stderr



假设我有一个从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?

在这种情况下,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[])

最新更新