我在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
只是为了让流程清晰:
main()
myTopJar.jar
方法中的最后一行应调用上述execCommand()
方法并退出(希望mySecondJar.jar
继续运行)。结果是myTopJar.jar
终止,也会终止mySecondJar.jar
进程。
有人可以在这里帮忙吗?
答案 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程序调用。