2016-10-14 6 views
0

シェルスクリプトから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(); 
      }    
     } 
    } 
} 

答えて

0

あなたのプリントストリームオブジェクトが初期化されるのに加えて使用されることはありません。ファイルに書き込む場合は、printstreamオブジェクトを呼び出す必要があります。

System.out.println("ExitValue: " + exitVal); 
//now call the printstream object 
out.print("ExitValue: " + exitVal); 
//flushing will force the string to be written to the file 
out.flush(); 

上記のコードは、コンソールに書き込むたびに実行し、printstreamオブジェクトを作成したファイルに書き込むことができます。

+0

StreamGobblerクラスで使用されています。私は言及すべきだった。しかし、私はそれが5回中に複数回ファイルに書き込まれていると言いましたが、すべてではありません5 – javagirl

+0

すべてのプロセスが正常に開始され停止していますか? –

+0

はい。これはrsyncプロセスであり、毎回ファイルをコピーしています。あなたがプリントを行うたびにprintstreamオブジェクトをフラッシュ()しましたか? – javagirl

関連する問題