Java进程将自己发送到后台

时间:2017-07-30 21:55:33

标签: java linux fork daemon jna

我知道如何对一个过程进行“deamonize”(不要与Thread.setDaemon混淆)。有一些答案herehere,我正在使用自己的perl包装器,效果很好。

但我现在想要的是,父进程等待Java进程,直到它说“OK”,即直到它真正成功启动(不仅是进程启动,而且一切运行良好)

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

  • 关闭标准输入,标准输出和标准错误。
  • 在后台运行(即分叉)
  • 忽略SIGHUP。

第一个和最后一个项目可以在流程开始之前完成,因此只剩下fork流程。由于ForkJoinPool存在,谷歌搜索“Java fork”是没有希望的。在我弄脏之前,我想知道是否

  • Java 9支持它(然后我就等了)
  • 某人已经使用JNA并且他们在
  • 中遇到了什么问题
  • 有一个更好的解决方案

我不关心Windows,因为它适用于Linux服务器。

1 个答案:

答案 0 :(得分:2)

我不知道这会转化为Java,但是从系统调用的角度来看:

当父母和孩子都完全掌控时,您应该致电pipesocketpair创建自己的沟通渠道,并通过环境变量或命令行参数将其指定给孩子。记得在每个进程中立即关闭一半(如果你有控制权,那么在fork和exec之间,或者通过CLOEXEC标志 - 这意味着子可执行文件根本不必知道父进程的结束)

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

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

您必须发送正面信息以表示成功;提前关闭管道必须被视为错误(尽管您可能也有明确的错误)。请注意,这意味着您不必跟踪退出值(如果“子”实际上是孙子,则非常有用)。

或者,也许你应该做一些别的工作:你的init系统,X11和DBUS?例如,如果孩子崩溃,你应该做什么思考