ホームページ >Java >&#&チュートリアル >Java で Bash コマンドを確実に実行し、その出力をキャプチャする方法
bash シェルでコマンドを実行する Java プログラムを作成することを目的としています。出力を収集します。ただし、最初の読み取り後に複数の出力ストリームが機能せず、「パイプの破損」例外が発生するという問題が発生しています。
1. ProcessBuilder を使用します:
プロセスを置き換え process = Runtime.getRuntime().exec("/bin/bash");
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; } }
注: このアプローチにより、実行されたコマンドからのすべての出力が保証されます。別のコマンドが入力される前にキャプチャされます。これにより、「パイプ切れ」例外が発生することなく、スレッド化されたスケジュールされたタスクでコマンドを継続的に実行できます。
以上がJava で Bash コマンドを確実に実行し、その出力をキャプチャする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。