シェルスクリプトからrsyncコマンドを実行できるクラスがあります。プロセスが毎回ログを記録しないループで実行する
プロセス出力(インストリームとエラーストリーム)をファイルに記録する場合を除いて、すべてが正常に動作します。
ループがあり、プロセスが失敗した場合、実行ごとに5つのストリーム/ライター/リーダーがすべて初期化され、完全に閉じられると5回の実行が許可されます。
問題は、ファイルが5回の実行で1回または2回だけ書き込まれ、出力と同じ実行ではないことです。出力をより読みやすくするためにプロセスの後に10秒のスリープを設定し、ファイルに書き込まれる唯一の出力が20秒後、30秒後、または10秒後および40秒後などであることがわかりました。
プロセスからのすべての出力コンソールには書かれているが、ファイルには書かれていない。
私のコードは以下の通りです。アドバイスをいただければ幸いです。
private static void run() throws IOException {
while (retry && NUMBER_OF_TRIES >= tries){
InputStream in = null;
PrintStream out = null;
InputStream errIn = null;
try {
// get runtime object to run cmd
Runtime RT = Runtime.getRuntime();
Process PR = RT.exec(cmd);
errIn = PR.getErrorStream();
in = PR.getInputStream();
out = new PrintStream(new FileOutputStream(new File(output), true));
System.out.println("file output initialised");
StreamGobbler inConsumer = new StreamGobbler(in, new Date() + " OUTPUT: ", out);
StreamGobbler errConsumer = new StreamGobbler(errIn, new Date() + " ERROR: ", out);
System.out.println("Starting consumer threads");
inConsumer.start();
errConsumer.start();
Thread.sleep(10000);
int exitVal = PR.waitFor();
if (exitVal > 0){
retry = true;
tries++;
} else {
retry = false;
}
System.out.println("ExitValue: " + exitVal);
// Wait for the consumer threads to complete
inConsumer.join();
errConsumer.join();
} catch (Exception e) {
e.printStackTrace();
System.out.println("failed: " + e.getMessage());
} finally {
// the StreamConsumer classes will close the other streams
if (out != null){
out.close();
}
if (in != null){
in.close();
}
if (errIn != null){
errIn.close();
}
}
}
}
StreamGobblerクラスで使用されています。私は言及すべきだった。しかし、私はそれが5回中に複数回ファイルに書き込まれていると言いましたが、すべてではありません5 – javagirl
すべてのプロセスが正常に開始され停止していますか? –
はい。これはrsyncプロセスであり、毎回ファイルをコピーしています。あなたがプリントを行うたびにprintstreamオブジェクトをフラッシュ()しましたか? – javagirl