Linux&;Java-从Java命令行断开进程

Linux&;Java-从Java命令行断开进程,java,linux,bash,Java,Linux,Bash,我在Ubuntu上运行。 我使用Java-jar myTopJar.jar从命令行启动了一个Java程序。 myTopJar.jar应该做一些事情,然后运行第二个jar并终止(myTopJar.jar应该终止并让第二个jar运行) 为了运行一个jar并解除其所有权(我是指从命令行),我使用了以下命令:java-jarmysecondjar.jar&disown 当我从我正在使用的Java实用程序运行命令时,我期望有相同的行为: import org.apache.commons.exec.*;

我在Ubuntu上运行。 我使用
Java-jar myTopJar.jar
从命令行启动了一个Java程序。 myTopJar.jar应该做一些事情,然后运行第二个jar并终止(myTopJar.jar应该终止并让第二个jar运行)

为了运行一个jar并解除其所有权(我是指从命令行),我使用了以下命令:
java-jarmysecondjar.jar&disown

当我从我正在使用的Java实用程序运行命令时,我期望有相同的行为:

import org.apache.commons.exec.*;

public static int execCommand () throws ExecuteException, IOException, InterruptedException {
    logger.debug("About to execute command: ", command);
    CommandLine commandLine = CommandLine.parse("java -jar mySecondJar.jar & disown");
    DefaultExecutor executor = new DefaultExecutor();
    DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
    executor.execute(commandLine, resultHandler);
    return 0;
}
我正在使用Apache的
commons-exec-1.2.jar
为了让流程更清晰:

  • 我正在从Linux命令行运行myToJar.jar
  • myTopJar.jar
    main()
    方法的最后一行应该调用上面的
    execCommand()
    方法并退出(希望
    mySecondJar.jar
    继续运行)
  • 结果是,
    myTopJar.jar
    终止,也终止了
    mySecondJar.jar
    进程


    有人能帮忙吗?

    你为什么不为第二次打电话做个包装呢。包装器将使用双叉技术使第二个进程成为一个正确的进程,这样第二个进程就不会连接到第一个进程的会话。如果您将要使用的系统上有可用的话,我会使用
    守护进程(3)
    函数用C编写一个包装器

    例如,您可以对包装器使用以下简单的C代码:

    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
            if (0 != daemon(1, 0)) { /* 1 for nochdir */
                    perror("daemon");
                    return 1;
            }
    
            if (0 != execl("/path/to/java", "/path/to/java", "-jar", "mySecondJar.jar", NULL)) {
                    perror("execl");
                    return 1;
            }
    
            /* not reached */
            return 0;
    }
    
    #包括
    #包括
    int main()
    {
    如果(0!=守护进程(1,0)){/*1用于nochdir*/
    佩罗(“守护进程”);
    返回1;
    }
    如果(0!=execl(“/path/to/java”、“/path/to/java”、“-jar”、“mySecondJar.jar”、NULL)){
    perror(“execl”);
    返回1;
    }
    /*未达到*/
    返回0;
    }
    

    编译它并从您的第一个Java程序调用。

    也许用运行第二个jar会有所帮助?您需要阅读一些关于原始UNIX exec调用和类似shell的bash调用的区别。在纯Java中不能这样做,因为它没有访问必要系统调用的权限;您必须使用shell命令,例如,
    sudo
    &