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

时间:2010-06-15 19:05:18

标签: java process apache-commons-exec

我正在尝试决定是使用ProcessBuilder还是Commons exec,

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

我在Linux上使用Java。

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

5 个答案:

答案 0 :(得分:9)

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
  • 改进了超时处理
  • 改进退出代码检查
  • 改进的API
    • 一个非常复杂的用例的衬里
    • 将过程输出转换为字符串
    • 的一个内衬
    • 访问流程对象
    • 支持异步流程(未来
  • 使用SLF4J API
  • 改进了日志记录
  • 支持多个流程

答案 1 :(得分:8)

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

答案 2 :(得分:1)

如果你想使用一个守护进程,那么Apache Commons Daemon可能会更合适吗?

答案 3 :(得分:1)

Commons Daemon完成了将Java进程作为守护进程启动的工作,但它并没有像人们期望的那样进行。例如,当标准C程序启动守护程序(例如,使用apache或sshd)时,它们会在分配到后台之前执行一些配置健全性检查和其他操作(如锁定锁定文件)。 Apache Commons Daemon是一个启动Java应用程序的c程序,不允许你在Java代码AFAIK中进行健全检查,从而打破了我认为重要的守护程序设施。

因此,如果你想要实现一个类似于sshd,apache等的守护进程启动器,那么我会建议公共exec。

答案 4 :(得分:1)