[英]Linux & Java - Disown a process from Java CommandLine
我在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
來使流程更清楚:
myTopJar.jar
的main()
方法的最后一行應調用上面的execCommand()
方法並退出(希望mySecondJar.jar
繼續運行)。 結果是myTopJar.jar
終止也終止了mySecondJar.jar
進程。
有人可以幫忙嗎?
您為什么不為第二個電話做包裝。 包裝程序將使用雙叉技術將第二個進程正確地設置為守護進程,以使第二個進程與第一個進程的會話無關。 如果要在您要使用的系統上使用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程序中調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.