在Apache Commons exec或ProcessBuilder之间做出决定

2022-09-01 17:39:31

我试图决定是否使用或共享资源执行官,ProcessBuilder

我的要求是,我只是试图创建一个守护进程,我不关心它的stdout/stdin/stderr。此外,我想在时机成熟时执行杀戮来破坏此过程。

我在Linux上使用Java。

我知道两者都有自己的痛苦和陷阱(例如,确保使用单独的线程来吞咽流可能会导致阻塞或死锁,以及关闭流,以免打开的文件悬而未决),并想知道是否有人有这样或那样的建议以及任何好的资源可以遵循。


答案 1

ZT Process Executor库是Apache Commons Exec的替代品。它具有运行命令,捕获其输出,设置超时,验证程序退出状态等功能。

我用了一点,我发现它设计得很好,有据可查。

文档中的示例

执行命令,将 stderr 泵送到记录器,将输出作为 UTF8 字符串返回。

 String output = new ProcessExecutor().command("java", "-version")
    .redirectError(Slf4jStream.of(getClass()).asInfo())
    .readOutput(true).execute()
    .outputUTF8();

它的文档列出了与Commons Exec相比的以下优势:

  • 改进了对流的处理
  • 读取/写入流
  • 将 stderr 重定向到 stdout
  • 改进了超时处理
  • 改进了对退出代码的检查
  • 改进的原料药
  • 一个衬垫,用于相当复杂的用例
  • 一个衬纸将过程输出转换为字符串
  • 对可用流程对象的访问
  • 支持异步进程(未来 )
  • 使用 SLF4J API 改进了日志记录
  • 支持多个流程

答案 2

commons-exec不是我用过的最好的库,但它确实解决了Java进程调用中最大的陷阱,即正确处理/消耗stdout/sterr。我过去使用过ProcessBuilder,这很好,现在commons-exec也很好,可以轻松处理大多数常见情况。


推荐