0

ファイルとSQLテーブルを操作し、そのテーブルのデータを期待値と比較するJUnitテスト内でいくつかのシェルスクリプトを呼び出すJavaプログラムに取り組んでいます(したがって、.とE以外は出力されません)。理論上はすべて機能しますが、1 つのタイプのテストは期待どおりに機能し、もう 1 つのタイプのテストは 10 分間のタイムアウト後に失敗するというストレージ バグに遭遇しています。問題をシェル スクリプトの 1 つに切り分けましたが、このスクリプトは作成していないため、変更することはできません。これをトラブルシューティングできる最善の方法は、問題のスクリプトの出力を保存することです。これは、一連のエコー コールからのものです。エコー出力を保存するためのやや簡単で信頼できる方法はありますか? 私は少しグーグルで調べましたが、何も出てきませんでした。まだ出力を保存しようとしていないので、保存しません

//Currently using BufferedWriter, File, FileWriter, IOException, and Writer
import java.io.*;

//Method to write to a log file
public void record(String input) throws IOException {
  writer = new BufferedWriter(new FileWriter(file,true));
  writer.write(input + "\n");
  writer.close();
}

Runtime rt = Runtime.getRuntime();

//Several of these since a lot of file manipulation/script running occurs
process = rt.exec("./shell.sh");
process.waitFor();

私が尋ねた別の質問では、いくつかの理由から Runtime.exec() を使用しないことを誰かが推奨していました。exec() を使用しないことの利点は理解していますが、このバージョンのプログラムでは使用する必要があります。

tl;dr の質問: 私の Java プログラムはシェル スクリプトを簡単に実行できるだけでなく、エコー出力を保存することもできますか? そうでない場合、出力を読み取るための tail -f に相当するものはありますか?

4

2 に答える 2

1

これをできるだけ簡単に行うには、外部プロセスの出力の非同期読み取りと書き込みを実際に使用する必要があります。それがおそらくブロックしてタイムアウトを引き起こしているものであり、スクリプトがechoコンテンツを戻す方法であり、それらは消費されていません。

このまったく同じ質問に対する回答をしばらく前に投稿しました。これは、外部プロセスから読み取るときにすべての状況で機能し、もう使用して使用しない理由ですProcess.exec()ProcessBuilder

于 2012-04-16T14:43:06.377 に答える
1

scriptWithOutput.shエコーをログファイルにリダイレクトするために、新しいスクリプトファイルを作成するのはどうですか

#!/bin/sh

log="someDir/someLog.log"

# This saves all you "echoes" to the log file
exec &> $log

# Your shell script
./shell.sh

そして、あなたのJavaコードで

process = rt.exec("./scriptWithOutput.sh");

次にsomeDir/someLog.log、Java から読み取りを試みますか?

于 2012-04-16T14:36:41.877 に答える