gpt4 book ai didi

java - Linux 和 Java - 从 Java 命令行拒绝进程

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:36 27 4
gpt4 key购买 nike

我在 Ubuntu 上运行。我有一个 Java 程序,使用 java -jar myTopJar.jar 从命令行启动。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. myTopJar.jarmain() 方法的最后一行应该调用上面的execCommand() 方法并退出(期望mySecondJar.jar 继续运行)。

结果是 myTopJar.jar 终止,mySecondJar.jar 进程也终止。

有人可以帮忙吗?

最佳答案

你为什么不为你的第二个电话做一个包装。包装器将使第二个进程成为 daemon正确使用双叉技术,以便第二个进程与第一个进程的 session 没有连接。如果它在您要使用的系统上可用,我会使用 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 程序调用。

关于java - Linux 和 Java - 从 Java 命令行拒绝进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26438046/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com