有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我需要在Java中生成一个进程(仅在Linux下),该进程将在JVM退出后继续运行。我该怎么做

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

我对黑客感兴趣;斜线方法,使其能够正常工作,如果您有更好的设计方案,还可以使用:)


共 (6) 个答案

  1. # 1 楼答案

    >>don't believe the spawned process will die when the JVM exits.

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

  2. # 2 楼答案

    如果您使用^{}生成进程,它应该“正常工作”——我不相信生成的进程会在JVM退出时消亡。您可能会发现Ant库使您更容易控制繁殖

  3. # 3 楼答案

    我认为Java的全部要点是它完全包含在JVM中。在没有运行时的情况下运行字节码有点困难

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

  4. # 4 楼答案

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

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

    如果它对您“刚好有效”,那么就没有问题,但是如果您发现自己的子进程也在JVM中关闭,那么值得一看“nohup”命令。进程不会响应SIGTERM信号,但会响应SIGKILL信号以及正常操作

    更新:上述方法有点过分。另一种方法是使用“&;”在命令结束时。这将产生一个新进程,它不是当前java进程的子进程

    另外,很抱歉更新了这么多,我一直在从头开始学习和尝试

  5. # 5 楼答案

    我在这方面遇到了问题,当JVM关闭时,启动的进程被终止

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

    以下是对我有效的代码(减去异常处理):

    ProcessBuilder pb = new ProcessBuilder(cmd);
    pb.redirectOutput(logFile);
    pb.redirectError(logFile);
    Process p = pb.start();
    
  6. # 6 楼答案

    它实际上“只是起作用”,除非你想变得聪明

    我的包装java。进程试图捕获脚本的输出,所以当JVM死机时,脚本没有任何地方可以发送输出,所以它就死机了。如果我不尝试捕获输出,或者脚本不生成任何输出,或者将所有内容重定向到文件或/dev/null,那么所有内容都会正常工作