我正在尝试决定是使用ProcessBuilder
还是Commons exec,
我的要求是我只是想创建一个守护进程,其stdout / stdin / stderr我并不关心。另外,我希望在时机成熟时执行kill来销毁这个进程。
我在Linux上使用Java。
我知道两者都有他们的痛苦和陷阱(例如确保使用单独的线程吞下流可能导致阻塞或死锁,并关闭流,以免留下打开的文件)并想知道是否有人有这样或那样的建议以及任何可以遵循的好资源。
答案 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的以下优点:
答案 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)