Linux& Java - 从Java CommandLine中删除进程

时间:2014-10-18 09:07:43

标签: java linux bash

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

为了运行jar并取消它(我的意思是从命令行)我曾经运行过这个命令:java -jar mySecondJar.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 只是为了让流程清晰:

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

    有人可以在这里帮忙吗?

1 个答案:

答案 0 :(得分:0)

为什么不为第二次通话制作包装。包装器将使用双叉技术使第二个进程正确daemon,这样第二个进程就不会与第一个进程的会话连接。如果在您将要使用的系统上可用,我会使用daemon(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;
}

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