【问题标题】:ProcessBulder loads the process but doesn't start itProcessBulder 加载进程但不启动它
【发布时间】:2025-12-19 03:20:23
【问题描述】:

我使用 ProcessBuilder 从 Java 应用程序(主机)启动一个新进程(子进程)。像这样的:

ProcessBuilder processBuilder = createProcess(commandLine);
processBuilder.directory(new File(baseDir));
processBuilder.redirectErrorStream(true);
Process process = null;
try {
    process = processBuilder.start();
} catch (Exception e) {
    e.printStackTrace();
}

我确实在系统监视器中看到子进程已启动,但它无法运行,除非我停止主机应用程序。更具体地说,子进程是一个服务器,在使用 ProcessBuilder 启动它之后,如果主机应用程序仍在运行,它不会响应请求。此外,服务器正在使用的端口仍然可用。如果我停止主机应用程序,服务器会立即开始工作。有什么我错过的或者 ProcessBuilder 应该如何工作的吗? 提前谢谢了。

【问题讨论】:

标签: java processbuilder


【解决方案1】:

在大多数情况下,在进程的标准输出缓冲区被清空之前,它不会终止。可能是您的进程已填满此缓冲区并已停止(出于某种原因)

尝试使用标准输出的流程(通过Process#getInputStream),看看是否会有所不同。

也可能是进程正在等待用户输入。

I'm not getting any output and probably the machine hangs with the code 为例

【讨论】:

  • 感谢@MadProgrammer!你是正确的。当我使用子进程的 InputStream 时它开始工作。像这样 bold'process = processBuilder.start(); is = process.getInputStream(); isr = new InputStreamReader(is); br = new BufferedReader(isr);字符串线; while (!stopProcess) { if (br.ready()) { line = br.readLine(); System.out.println(line); } }'
【解决方案2】:

@MadProgrammer 是正确的。我能够解决这个问题,我想用一个代码示例来回答我的问题。这对其他人也可能有用。 您需要在启动子进程后从子进程中使用标准。像这样的:

        process = processBuilder.start();
        InputStream is = process.getInputStream();
        INputStreamReadr isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while (!stopProcess) {
            if (br.ready()) {
                line = br.readLine();
                System.out.println(line);
            }
        }

【讨论】:

  • 什么是stopProcess?