Java 进程将自身发送到后台

Java process sending itself to the background

我知道如何 "deamonize" 一个过程(不要与 Thread.setDaemon 混淆)。有一些答案 here and here 我正在使用我自己的 perl 包装器,它工作正常。

但我现在想知道的是,父进程是否在等待 Java 进程,直到它说 "OK",即直到它真正成功启动(不仅是进程启动, 但一切都很好 运行).

我可以通过编写文件、绑定到套接字或类似方式来指示这一点,但它很难看。在 deamonize 列表的八个项目中,我只需要以下三个稍微简化的形式:

第一项和最后一项可以在流程开始之前完成,因此只剩下 fork 流程。谷歌搜索 "Java fork" 是没有希望的,因为 ForkJoinPool 存在。在我动手之前,我想知道

我不关心 Windows 因为它是 Linux 服务器。

我不知道这转换成 Java 的效果如何,但从系统调用的角度来看:

当parent和child都在你的完全控制之下时,你应该调用pipesocketpair来创建你自己的沟通渠道,并将其指定给child 通过环境变量或 command-line 参数。记住立即关闭每个进程的一半(如果你在那里有控制权,或者在 fork 和 exec 之间,或者通过 CLOEXEC 标志 - 这意味着 child executable 永远不必知道关于 parent 的结局)。

我不确定为什么你似乎对使用套接字犹豫不决 - 也许你的印象是本地套接字占用端口(它们不占用) - 尽管如果所有数据都在一个方向上传输,我会为了清楚起见,更喜欢管道。

如果child可以创建自己的children,您应该尽快在继承的管道上设置CLOEXEC标志。

您必须发送正面消息表示成功;提前关闭管道必须被视为错误(尽管您也可能有明确的错误)。请注意,这意味着您不必跟踪退出值(如果 "child" 实际上是一个 grandchild 则很有用)。


或者,也许您应该让其他东西来完成这项工作:您的初始化系统、X11 和 DBUS?例如,如果 child 崩溃,您 认为 应该做什么?