【发布时间】:2017-07-30 21:55:32
【问题描述】:
我知道如何“去魔化”进程(不要与Thread.setDaemon 混淆)。有一些答案 here 和 here 我正在使用我自己的 perl 包装器,效果很好。
但我现在想得到的是,父进程等待 Java 进程,直到它说“OK”,即,直到它真正成功启动(不仅进程启动,而且一切正常运行) .
我可以通过编写文件、绑定到套接字或类似方式来表明这一点,但它很难看。在deamonize 列表中的八项中,我只需要稍微简化的以下三项:
- 关闭标准输入、标准输出和标准错误。
- 在后台运行(即 fork)
- 忽略 SIGHUP。
第一项和最后一项可以在进程开始之前完成,因此只剩下forking 进程。由于存在ForkJoinPool,因此在谷歌上搜索“Java fork”是没有希望的。在我弄脏手之前,我想知道是否
- Java 9 支持它(那我就等着看)
- 有人已经在使用 JNA 并且遇到了什么问题
- 有更好的解决方案
我不关心 Windows,因为它适用于 Linux 服务器。
【问题讨论】:
-
进程内守护进程真的不是一个好主意。即使你认为你不需要其中的一些东西,你也可能真的需要(例如,未能放弃控制终端可能最终会使你的整个系统无法使用)......以及 8 个列表非常不完整。
-
@o11c 你可能是对的,但你能详细说明一下吗?我真的只做这三件事,并且在生产两年后(代码继承自旧项目)。我可能应该切换到守护进程,但我仍在考虑在 Java 中进行分叉。
-
例如,如果你不放弃控制终端,
/dev/pts/可能会慢慢填满,然后你就根本无法创建任何新终端。现在,如果你访问/dev/tty1,你可以用它来杀死邪恶的守护进程,但如果你只有 SSH,你就完蛋了。 -
注意:我实际上并不知道如何安全地守护进程。相反,我知道不去尝试。
-
如今,正确守护进程的最佳方式似乎是“docker run ...”...
标签: java linux fork daemon jna