【问题标题】:Java subprocess terminated by itselfJava 子进程自行终止
【发布时间】:2015-10-16 04:11:17
【问题描述】:

我的应用程序为子任务使用了一些守护程序子进程。子流程使用 ProcessBuilder 启动并自行正常工作,但随后将它们作为子流程启动,每个关联的 Process.isAlive() 方法都返回 FALSE。如下,无法访问进程。

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

【问题讨论】:

  • 发布一些您正在做的事情的示例代码,我们或许可以提供帮助...

标签: java subprocess processbuilder


【解决方案1】:

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

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

【讨论】:

  • 我的守护进程是纯 java :)
  • 很难用纯Java 制作守护进程。你的“子程序”实际上是守护进程吗?
  • 它们有点……这些是由主应用程序启动的后台服务,没有任何自己的 gui。
【解决方案2】:

命令真的在运行吗?尝试从 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");
}

【讨论】:

    猜你喜欢
    • 2015-01-27
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多