【问题标题】:Java.lang.Process redirect errorstream to /dev/nullJava.lang.Process 将错误流重定向到 /dev/null
【发布时间】:2012-03-23 10:47:40
【问题描述】:

我启动了一个进程(通过 java.lang.Runtime#exec,在 Java 6、Linux 上),我只需要标准输出。不幸的是,我运行的程序(ffmpeg)坚持使用进度信息来混淆标准错误。如果我不时不时从 stderr 读取,则 stderr 缓冲区会填满,并且进程会在一段时间后停止..

基本上我想要的是丢弃 stderr 的任何输出。我的建议

1)

ffmpeg -i .... .... 2>/dev/null

这可行,但意味着我必须使用 exec(String) 而不是 exec(String[]),这意味着我必须转义我的参数,Java 中没有标准函数。我可以建造一个,但不喜欢。

2)

在包装脚本中使用上述 ffmpeg 命令,将输出重定向到 /dev/null。听起来不错,但是为此编写一个 bash 脚本似乎有点过头了。

3)

同时附加 ErrorStream,启动一个除了 read() 之外什么都不做的线程。可以,但看起来很乱......

4) 使用 Apache Commons Exec... 我什至没有检查文档以查看这是否可行,但是仅仅为了这样一个简单的任务导入整个库也感觉不对。

所以基本上我的问题是:有没有更好的方法来做到这一点?如果不是,你认为哪个[strike]最漂亮[/strike]最不丑?

【问题讨论】:

  • 如果你在进程启动后简单地关闭错误流会发生什么 - 因此,告诉操作系统“我不想要进程正在写的东西,把它扔掉”。
  • 有趣的想法。只是把它进行测试,不幸的是它有同样的问题。过了一会儿它就停止了,我只能将其归因于 stderr 上的完整缓冲区。
  • 更正我之前的评论:获取错误流并直接关闭它只会杀死子进程。

标签: java bash process


【解决方案1】:

在这些选项中,第 3 个选项 - 创建一个线程来读取错误流 - 可能是最好的。

编写自己的解析器将是一项相当大的工作量,并且会成为不必要的错误来源。使用包装脚本会产生额外的不必要的依赖,即另一个潜在的问题来源。当您已经有了一个只有几行简单代码的解决方案时,我不认为要使用新库。

【讨论】:

  • 有趣的是,这也是我自己的选择,很高兴看到其他人同意。作为奖励,我可以保存最后 1kb 的 stderr 而不是全部丢弃。因此,当事情中断时,我仍然会收到错误消息。
【解决方案2】:

您也可以使用Overthere 来代替Apache Commons Exec。它支持(本地)流程执行。并为您吞噬标准输出和标准错误。

【讨论】:

  • 感谢您的链接,但它也有同样的问题。我不想介绍(并且不得不深入研究文档)另一个库。不过,对于可能的未来项目,请记住这一点……
【解决方案3】:

您可以使用ProcessBuilder 并将标准错误重定向(redirectErrorStream(true))重定向到标准输出,然后您只需读取一个流的输出。这可能会使您所做的任何输出解析变得更加困难。一个好处是这是一个 Java 类,不需要外部库。

【讨论】:

  • 谢谢,不幸的是我从标准输入读取了转码的音频流。无法将其与标准输出上的消息区分开来。
猜你喜欢
  • 2017-11-29
  • 2018-05-10
  • 2020-02-10
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多