首页 > Java > java教程 > 如何在 Java 中可靠地执行 Bash 命令并捕获其输出?

如何在 Java 中可靠地执行 Bash 命令并捕获其输出?

Susan Sarandon
发布: 2024-12-19 11:19:14
原创
672 人浏览过

How to Reliably Execute Bash Commands and Capture Their Output in Java?

在 Java 中使用输入/输出流执行命令

问题概述

您的目标是创建一个在 bash shell 中执行命令的 Java 程序,并且收集他们的输出。但是,您遇到了多个输出流在第一次读取后无法工作以及“管道损坏”异常的问题。

解决方案

1.使用 ProcessBuilder:

替换 Process process = Runtime.getRuntime().exec("/bin/bash"); with:

ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectErrorStream(true);
Process process = builder.start();
登录后复制

ProcessBuilder 允许将标准错误重定向到标准输出,从而无需为 stderr 和 stdout 使用单独的线程。

2.等待输出完成:

从输出流读取的循环 (reader.readline()) 将阻塞,直到进程退出或发送文件结尾。为了避免挂起,请确保仅在收到预期输出时才进行循环迭代。

3.使用“魔线”标记输出结束:

要可靠地确定执行命令的输出何时完成,请考虑写出特定行(例如“--EOF--”)表示输出结束。下面的代码片段演示了这种技术,有助于处理进程不以换行符终止的情况:

while (scan.hasNext()) {
    String input = scan.nextLine();
    if (input.trim().equals("exit")) {
        writer.write("exit\n");
    } else {
        writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n");
    }
    writer.flush();

    line = reader.readLine();
    while (line != null && ! line.trim().equals("--EOF--")) {
        System.out.println("Stdout: " + line);
        line = reader.readLine();
    }
    if (line == null) {
        break;
    }
}
登录后复制

限制

  • 解决方案仅限于处理等待用户输入或生成不带换行符的输出的命令。
  • 它假设命令输出 --EOF--
  • 在书面命令中使用括号可能会导致 bash 中的语法错误。

注意:这种方法可确保执行命令的所有输出在输入另一个命令之前捕获。它允许在线程计划任务中连续执行命令,而不会遇到“Broken pipeline”异常。

以上是如何在 Java 中可靠地执行 Bash 命令并捕获其输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板