我正在尝试决定是使用ProcessBuilder
还是 Commons exec,
我的要求是我只是想创建一个我不关心的 stdout/stdin/stderr 的守护进程。另外,我想在时机成熟时执行 kill 以销毁此进程。
我在 Linux 上使用 Java。
我知道两者都有自己的痛苦和陷阱(例如确保使用单独的线程来吞下流可能会导致阻塞或死锁,并关闭流以免留下打开的文件)并且想知道是否有人有建议方式或其他方式以及任何好的资源可以遵循。
我正在尝试决定是使用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 相比的以下优势:
commons-exec 不是我用过的最好的库,但它确实解决了 Java 进程调用中的最大缺陷,即正确处理/使用 stdout/sterr。我过去使用过 ProcessBuilder,这很好,现在 commons-exec 也很好,可以轻松处理大多数常见情况。
您可能对我的Exec 库感兴趣吗?
如果您想使用守护进程,也许 Apache Commons Daemon 会更合适?
Commons Daemon 完成了将 Java 进程作为守护进程启动的工作,但它并没有按照人们期望的方式进行。例如,当一个标准的 C 程序启动一个守护进程(以 apache 或 sshd 为例)时,它们会在分叉到后台之前执行一些配置完整性检查和其他事情(如锁定锁定文件)。Apache Commons Daemon 是一个启动 Java 应用程序的 ac 程序,它不允许您在 Java 代码 AFAIK 中进行健全性检查,从而破坏了我认为重要的守护程序设施。
因此,如果您希望实现一个行为类似于 sshd、apache 等的守护进程启动器,那么我建议您使用 commons exec。