簡體   English   中英

Linux和Java-從Java CommandLine取消進程

[英]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來使流程更清楚:

  1. 我正在從Linux命令行運行myToJar.jar
  2. myTopJar.jarmain()方法的最后一行應調用上面的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM