首頁 >Java >java教程 >如何在 Java 中可靠地執行 Bash 命令並捕獲其輸出?

如何在 Java 中可靠地執行 Bash 命令並捕獲其輸出?

Susan Sarandon
Susan Sarandon原創
2024-12-19 11:19:14674瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn