我正在尝试决定是使用 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/