在Java中生成一个在JVM关闭后幸存的进程

我需要在Java(仅在Linux下)生成一个进程,该进程将在JVM退出后继续运行。 我怎样才能做到这一点?

基本上,Java应用程序应该生成一个更新程序,它会停止Java应用程序,更新文件然后再次启动它。

我对hack&slash方法感兴趣,只是为了让它工作以及更好的设计方案,如果你有一个:)

如果你使用java.lang.Process生成进程它应该“正常工作” – 我不相信当JVM退出时,生成的进程将会死亡。 您可能会发现Ant库使您可以更轻松地控制产卵。

它实际上“只是工作”,除非你想要聪明。

我的包装java.lang.Process试图捕获脚本的输出,所以当JVM死了,脚本没有任何地方发送输出所以它只是死了。 如果我不尝试捕获输出,或者脚本没有生成任何内容或将所有内容重定向到文件或/ dev / null,则一切正常。

我遇到了这个问题,当JVM关闭时,启动的进程被杀死了。

将stdout和stderr重定向到文件修复了该问题。 我想这个过程与启动的java应用程序有关,因为默认情况下它希望将输出传递给它。

这是适合我的代码(减去exception处理):

 ProcessBuilder pb = new ProcessBuilder(cmd); pb.redirectOutput(logFile); pb.redirectError(logFile); Process p = pb.start(); 

我认为Java的全部意义在于它完全包含在JVM中。 当没有运行时,运行字节码有点困难。

如果您希望有一个完全独立的进程,您可能会尝试启动第二个java.exe实例。 虽然对于您的应用程序,可能更容易简单地创建一个同步块来停止(但不会终止)您的应用程序,进行更新,然后重新初始化您的应用程序的数据。

它并不总是“正常工作”。 当JVM生成子进程然后关闭时,子进程在某些情况下也会关闭。 这是该过程的预期行为。 在WIN32系统下,它只是工作。

例如,如果WebLogic服务器是由Java进程启动的,然后该进程退出,它还会通过JVM中的shutdown hook将关闭信号发送到WebLogic,这会导致WebLogic也关闭。

如果它对您“正常工作”则没有问题,但是如果您发现自己处于子进程也与JVM关闭的位置,那么值得查看“nohup”命令。 该过程不会响应SIGTERM信号,但会响应SIGKILL信号以及正常操作。

更新:上述方式有点矫枉过正。 另一种方法是在命令结束时使用“&”。 这将生成一个不是当前java进程的子进程的新进程。

PS抱歉有这么多更新,我一直在学习并从头开始尝试。

>>不要相信当JVM退出时,生成的进程将会死亡。

每当我杀死java时,子进程总是在我的盒子(SuSE)上死掉。 我认为,如果处理父进程的I / O(即java),子进程将会死掉

如果您正在考虑在Linux上创建更新程序,那么您可能正在咆哮错误的树。 我相信所有主要的Linux发行版都内置了一个包管理器。您应该使用包管理器进行更新。 没有什么比尝试自我更新的程序更让我感到沮丧……(我在看着你,Eclipse)