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

标签 java linux bash

我在 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/

相关文章:

java - 继承 Comparable 与泛型

c++ - 怎么知道哪段内存全为零

linux - 如何唯一标识一个 USB 设备?

linux - 如何杀死所有名为 "shairport"且 pid 不是 12345 的进程

linux - 如何shell脚本AT+CSQ输出到串口

java - 对 Jersey 客户端的 POST 请求无法解码包含空数组的 JSON 对象?

java - Docker (Kubernetes) 中 Java 应用程序的配置

java - 没有Ajax想要打两个Url

linux - 在 Linux 中打印特定文本行的单个部分

c - 为什么这个声明有意想不到的副作用?