【问题标题】:Java on Linux unable to read process inputstreamLinux 上的 Java 无法读取进程输入流
【发布时间】:2015-12-23 05:30:55
【问题描述】:

我正在使用 Java 中的 ProcessBuilder 生成一个进程并尝试读取其输出:

public static void main(String... args) throws IOException, InterruptedException {

    ProcessBuilder builder = new ProcessBuilder("test.exe");
    Process process = builder.start();

    InputStream stdout = process.getInputStream();
    final BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
    final List<String> queue = new ArrayList<String>();

    Thread ioThread = new Thread() {
        public void run() {
            System.out.println("STARTED THREAD");
            String line = null;
            try {
                while ((line = reader.readLine()) != null) {
                    System.out.println("ADD: " + line);
                    queue.add(line);
                    Thread.yield();
                }
            } catch (IOException exception) {
                System.err.println("Fatal Error: " + exception.getMessage());
            }
        }
    };
    ioThread.start();

    Thread.sleep(10000);
    System.out.println("GOT: " + queue);
}

这在我的 Windows 机器上运行良好,在本地 Linux 安装上也是如此。

在我的 Linux 虚拟机(DigitalOcean 和 Linode)上,它不起作用,但是,这意味着进程已启动,但正在运行的线程无法将单行添加到队列中(在主程序中等待十秒钟后,队列为空,而在 Windows 中,队列包含读取行)。

到目前为止我已经尝试过的想法:

  • 将错误流重定向到输出流(尽管我确定测试程序在 STDOUT 上输出行
  • 使用带有 -oL 和 -eL... 的 stdbuf 不起作用
  • 尝试手动逐字节读取而不是使用 BufferedReader,同样的问题
  • 将线程转换为 FutureTask
  • 在 OpenJDK 和 Oracle VM 之间切换

它绝对适用于 Windows 和某些 Linux 机器。

【问题讨论】:

    标签: java linux multithreading process output


    【解决方案1】:

    这毕竟是一个缓冲问题:一个stdbuf 在这种情况下无法修复。

    使用script 的伪终端可以解决问题,但是,使用:

    ProcessBuilder builder = new ProcessBuilder();
    builder.command().add("script");
    builder.command().add("-c");
    builder.command().add(command);
    builder.command().add("-f");
    builder.command().add("-q");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-07
      • 2011-04-13
      • 2022-01-11
      • 2012-03-21
      • 2014-12-13
      • 2012-03-12
      • 1970-01-01
      • 2015-03-22
      相关资源
      最近更新 更多