タイムアウト値を設定しているときにプロセスの出力を取得するにはどうすればよいですか?Javaプロセスが出力を取得してタイムアウトを設定する
私は現在、プロセスの標準出力とエラー出力から文字列を作成するために、apache commons io utilsを使用しています。
以下のコードは(コメントとともに)終了するプロセスで正常に動作します。ただし、プロセスが終了しない場合、メインスレッドは終了しません!
コメント付きコードのコメントを外してprocess.waitfor()をコメントアウトすると、メソッドは非終了プロセスを適切に破棄します。しかし、プロセスを終了するためには、出力が正しく取得されません。 waitfor()が完了すると、プロセスの入力ストリームとエラーストリームを取得できないようです。
最後に、process.waitfor()が現在のところにコメントされたセクションを移動しようとすると、process.waitfor()を削除してコメントのセクションのコメントを外し、終了していないプロセスの場合はメインスレッドも停止しません。これは、process.waitfor(15、...)に決して到達しないためです。 @EJPが示唆したように
private static Outputs runProcess(String command) throws Exception {
Process process = Runtime.getRuntime().exec(command);
// if (!process.waitFor(15, TimeUnit.SECONDS)) {
// System.out.println("Destroy");
// process.destroy();
// }
// Run and collect the results from the standard output and error output
String stdStr = IOUtils.toString(process.getInputStream());
String errStr = IOUtils.toString(process.getErrorStream());
process.waitFor();
return new Outputs(stdStr, errStr);
}
を処理するさまざまな方法を説明して非常に良いブログです。 – EJP