我知道如何对一个过程进行“deamonize”(不要与Thread.setDaemon
混淆)。有一些答案here和here,我正在使用自己的perl包装器,效果很好。
但我现在想要的是,父进程等待Java进程,直到它说“OK”,即直到它真正成功启动(不仅是进程启动,而且一切运行良好)
我可以通过编写文件,绑定到套接字或类似来表明这一点,但它很难看。在deamonize列表中的八个项目中,我只需要以略微简化的形式提供以下三个项目:
第一个和最后一个项目可以在流程开始之前完成,因此只剩下fork流程。由于ForkJoinPool
存在,谷歌搜索“Java fork”是没有希望的。在我弄脏之前,我想知道是否
我不关心Windows,因为它适用于Linux服务器。
答案 0 :(得分:2)
我不知道这会转化为Java,但是从系统调用的角度来看:
当父母和孩子都完全掌控时,您应该致电pipe
或socketpair
创建自己的沟通渠道,并通过环境变量或命令行参数将其指定给孩子。记得在每个进程中立即关闭一半(如果你有控制权,那么在fork和exec之间,或者通过CLOEXEC标志 - 这意味着子可执行文件根本不必知道父进程的结束)
我不确定为什么你似乎对使用套接字犹豫不决 - 也许你的印象是本地套接字会占用端口(它们没有) - 尽管如果所有数据都朝着一个方向传播我宁愿使用管道为了清楚起见。
如果孩子可以创建自己的孩子,你应该尽快在继承的管道上设置CLOEXEC
标志。
您必须发送正面信息以表示成功;提前关闭管道必须被视为错误(尽管您可能也有明确的错误)。请注意,这意味着您不必跟踪退出值(如果“子”实际上是孙子,则非常有用)。
或者,也许你应该做一些别的工作:你的init系统,X11和DBUS?例如,如果孩子崩溃,你应该做什么思考?