我需要在Java(在Linux下专门)生成一个在JVM退出后继续运行的进程。我怎样才能做到这一点?
基本上,Java应用程序应该生成一个更新程序,它会停止Java应用程序,更新文件,然后再次启动它。
我对hack& amp;如果您有一个更好的设计方案,请使用斜杠方法使其正常工作:)
答案 0 :(得分:17)
如果你使用java.lang.Process
产生进程,它应该“正常工作” - 我不相信当JVM退出时,生成的进程将会死亡。您可能会发现Ant库使您可以更轻松地控制产卵。
答案 1 :(得分:10)
它确实“只是工作”,除非你想要聪明。
我的包装java.lang.Process试图捕获脚本的输出,所以当JVM死了,脚本没有任何地方发送输出所以它就会死掉。如果我不尝试捕获输出,或者脚本没有生成任何内容或将所有内容重定向到文件或/ dev / null,则一切正常。
答案 2 :(得分:3)
我遇到了这个问题,当JVM关闭时,启动的进程被杀死了。
将stdout和stderr重定向到文件修复了该问题。我想这个过程与启动的java应用程序有关,因为默认情况下它希望将输出传递给它。
这是适合我的代码(减去异常处理):
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectOutput(logFile);
pb.redirectError(logFile);
Process p = pb.start();
答案 3 :(得分:-1)
我认为Java的重点在于它完全包含在JVM中。当没有运行时,运行字节码有点困难。
如果您希望拥有完全独立的进程,可能会尝试启动第二个java.exe实例。虽然对于您的应用程序,可能更容易简单地创建一个同步块来停止(但不会杀死)您的应用程序,进行更新,然后重新初始化您的应用程序的数据。
答案 4 :(得分:-1)
它并不总是“正常工作”。当JVM生成子进程然后关闭时,子进程在某些情况下也会关闭。这是该过程的预期行为。在WIN32系统下,它只是工作。
E.g。如果WebLogic服务器是由Java进程启动的,然后该进程退出,它还会通过JVM中的shutdown hook将关闭信号发送到WebLogic,这会导致WebLogic也关闭。
如果它对你来说“正常”,则没有问题,但是如果你发现自己处于子进程也与JVM关闭的位置,那么值得查看“nohup”命令。该过程不会响应SIGTERM信号,但会响应SIGKILL信号以及正常操作。
更新:上述方式有点矫枉过正。另一种方法是使用“&”在命令结束时。这将生成一个新进程,该进程不是当前java进程的子进程。
P.S。很抱歉这么多的更新,我一直在学习并从头开始尝试。
答案 5 :(得分:-1)
>>不相信当JVM退出时,生成的进程将会死亡。
每当我杀死java时,子进程总是在我的盒子(SuSE)上死掉。我认为,如果处理父进程的I / O(即java),子进程将会死亡
答案 6 :(得分:-5)
如果您正在考虑在Linux上创建更新程序,那么您可能正在咆哮错误的树。我相信所有主要的Linux发行版都内置了一个包管理器。您应该使用包管理器进行更新。没有什么比试图自我更新的程序更让我感到沮丧...(我在看着你,Eclipse)