Java子进程自行终止

时间:2015-07-25 15:49:33

标签: java subprocess processbuilder

我的应用程序使用一些守护进程子进程来进行子任务。子进程使用ProcessBuilder启动并且可以自行工作,但是然后将它们作为子进程启动,每个关联的Process.isAlive()方法返回FALSE。如下所示,无法访问进程。

进一步调查显示子进程根本没有启动(不存在于任务管理器中),根本没有生成错误。

2 个答案:

答案 0 :(得分:1)

守护进程通常会启动一个单独的进程并几乎立即退出,这使得像isAlive()这样的检查无效。

程序通常会有一个命令行开关,使程序保持在前台,而不是成为守护进程 - 如果可能的话使用它。否则,您将需要一些其他方式来监视守护程序执行,例如使用守护程序的PID文件。

答案 1 :(得分:0)

命令真的在运行吗?尝试从Java内部运行程序时,通常会出现奇怪的小问题。

例如,可能未正确设置PATH环境变量,因此无法加载依赖项。

使用此方法查看是否有任何控制台输出以及退出代码是什么。这使用旧的Runtime类而不是ProcessBuilder。它可能适合使用ProcessBuilder。

public static void runExe(String[] command) throws IOException {
    Runtime runtime = Runtime.getRuntime();
    long start = System.currentTimeMillis();
    Process proc = runtime.exec(command);
    BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    try {

        while (true) {

            // enter a loop where we read what the program has to say and wait for it to finish
            // read all the program has to say
            while (br.ready()) {
                String line = br.readLine();
                System.out.println("CMD: " + line);
            }

            try {
                int exitCode = proc.exitValue();
                System.out.println("exit code: " + exitCode);
                // if we get here then the process finished executing
                break;
            } catch (IllegalThreadStateException ex) {
                // ignore
            }

            // wait 200ms and try again
            Thread.sleep(200);

        }

    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
    long end = System.currentTimeMillis();
    System.out.println("Command took: " + (end - start) + "ms");
}