我在 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
只是为了使流程清晰:
- 我正在从 Linux 命令行运行 myToJar.jar
myTopJar.jar
的main()
方法的最后一行应该调用上面的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/