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

Tra*_*ker 21 java process apache-commons-exec

我试图决定是否使用ProcessBuilder或Commons exec,

我的要求是我只是想创建一个守护进程,其stdout/stdin/stderr我并不关心.另外,我希望在时机成熟时执行kill来销毁这个进程.

我在Linux上使用Java.

我知道两者都有他们的痛苦和陷阱(例如确保使用单独的线程吞下流可能导致阻塞或死锁,并关闭流,以免留下打开的文件)并想知道是否有人有建议方式或其他方式以及任何良好的资源.

Lii*_*Lii 9

ZT处理执行库是Apache的百科全书Exec的一种替代方法.它具有运行命令,捕获输出,设置超时等功能.

我还没有使用它,但它看起来相当充分.

文档中的示例:执行命令,将stderr泵入记录器,将输出返回为UTF8字符串.

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

其文档列出了Commons Exec的以下优点:

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


Mik*_*e Q 8

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