您的目標是建立一個在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; } }
注意:此方法可確保執行指令的所有輸出在輸入另一個指令之前擷取。它允許在線程計劃任務中連續執行命令,而不會遇到“Broken pipeline”異常。
以上是如何在 Java 中可靠地執行 Bash 命令並捕獲其輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!