2016-10-14 2 views
0

У меня есть класс, в котором я могу запускать команды rsync из сценария оболочки.Обработка процесса в цикле не регистрируется каждый раз

Все работает так, как должно, за исключением случаев, когда регистрируется выход процесса (поток потока и ошибок) в файл.

У меня есть цикл в моем классе, который позволяет 5 запусков, если процесс завершается с ошибкой, и в каждом запуске каждый поток/запись/считыватель инициализируется и полностью закрывается.

Проблема заключается в том, что файл записывается только один или два раза в течение 5 прогонов, и это никогда не те же прогоны, которые выводятся. Я установил 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 «out» использовался, кроме того, что он инициализировался. Если вы хотите записать в файл, вы должны вызвать объект 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, и он копирует файлы каждый раз. Он выводит поток на консоль, а не на файл – javagirl

Смежные вопросы