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

标签 java process apache-commons-exec

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

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

我在 Linux 上使用 Java。

我知道两者都有自己的痛苦和陷阱(例如,确保使用单独的线程来吞下流会导致阻塞或死锁,并关闭流以免留下打开的文件)并且想知道是否有人有一种或另一种方式的建议以及任何好的资源可以遵循。

最佳答案

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

我已经使用了一点,我发现它设计得很好,文档也很合理。

文档中的示例

执行命令,将标准错误输出到记录器,将输出作为 UTF8 字符串返回。

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

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

  • 改进了流的处理
  • 读取/写入流
  • 将标准错误重定向到标准输出
  • 改进了超时处理
  • 改进了退出代码检查
  • 改进的 API
  • 一个适用于相当复杂用例的内衬
  • 一个将进程输出转换为字符串的衬垫
  • 可以访问 Process 对象
  • 支持异步进程( future )
  • 使用 SLF4J API 改进了日志记录
  • 支持多进程

关于java - 在 Apache Commons exec 或 ProcessBuilder 之间做出决定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3048212/

相关文章:

java - 公共(public)执行 : Executing a program on the system PATH?

java - 如果我的 android 项目依赖于具有其他依赖项的 .jar,我是否必须将这些依赖项包含在我的项目中?

java - Spring Security protected void configure(HttpSecurity http) 请解释 "and() "的正确使用。这是什么意思?

java - 从进程中读取错误流

linux - 守护进程挂载失败

java - 从java commons-exec启动的应用程序无法在win7上访问web,但从cmd.exe启动可以

java - doOnNext() 中的主题未调用 Consumer.accept()

java - wicket 应用程序的多用户测试方法

c# - 删除另一个文件后无法创建另一个文件,因为它已被另一个进程使用

java - 从 Apache exec commons 获取并解析输出流