ホームページ > Java > &#&チュートリアル > Java で Bash コマンドを確実に実行し、その出力をキャプチャする方法

Java で Bash コマンドを確実に実行し、その出力をキャプチャする方法

Susan Sarandon
リリース: 2024-12-19 11:19:14
オリジナル
671 人が閲覧しました

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

Java の入出力ストリームを使用したコマンドの実行

問題の概要

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;
    }
}
ログイン後にコピー

制限事項

  • ソリューションは次の点に制限されています。ユーザー入力を待機するコマンド、または改行なしで出力を生成するコマンドを処理します。
  • コマンドが --EOF-- を出力すると想定します。 line.
  • 書かれたコマンドで括弧を使用すると、bash で構文エラーが発生する可能性があります。

注: このアプローチにより、実行されたコマンドからのすべての出力が保証されます。別のコマンドが入力される前にキャプチャされます。これにより、「パイプ切れ」例外が発生することなく、スレッド化されたスケジュールされたタスクでコマンドを継続的に実行できます。

以上がJava で Bash コマンドを確実に実行し、その出力をキャプチャする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート