【问题标题】:Output stops reading from my Process输出停止从我的进程中读取
【发布时间】:2012-02-01 06:14:19
【问题描述】:

我有一些非常简单的 Java 代码,我正在其中启动另一个进程并尝试将所有标准输出和标准错误记录到 SLF4J。

this.service.serverProcess = Runtime.getRuntime().exec(arguments);

this.service.serverIsRunning = true;

BufferedReader serverStdout = new BufferedReader(new InputStreamReader(
                    this.service.serverProcess.getInputStream()), 16);
BufferedReader serverStderr = new BufferedReader(new InputStreamReader(
                    this.service.serverProcess.getErrorStream()), 16);

String stdoutLine = null;
String stderrLine = null;

while ((stdoutLine = serverStdout.readLine()) != null || 
        ((stderrLine = serverStderr.readLine()) != null)) {
    if (stdoutLine != null && stdoutLine.trim().length() > 0)
        logger.info("{}", stdoutLine);
    if (stderrLine != null && stderrLine.trim().length() > 0)
        logger.error("{}", stderrLine);
}

try { this.service.serverProcess.waitFor(); } catch (InterruptedException e) {};

this.service.serverIsRunning = false;

不幸的是,我只从我的流程中获得了第一行输出,我从来没有看到比这更多的输出,尽管我确信输出比我看到的要多得多。

这里出了什么问题?我希望它在事件发生后立即记录,因为输出对我保留的日志很重要。如何获得我的流程的 STDOUT 和 STDERR 的完整输出?

【问题讨论】:

    标签: java exec


    【解决方案1】:

    我怀疑问题是你从来没有从 stderr 读取 - 所以如果进程已经填满了它为 stderr 提供的任何缓冲区但没有向 stdout 打印任何内容,你将阻止尝试读取 stdout。

    我建议您在不同的线程中启动其中一个读取循环:一个从 stdout 读取,一个从 stderr 读取。

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多