У меня есть класс, в котором я могу запускать команды 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();
}
}
}
}
Он используется в классе StreamGobbler. Я должен был упомянуть. Но я упомянул, что он записывается в файл несколько раз из 5, только не все 5 – javagirl
уверены, что каждый процесс успешно запущен и остановлен? –
Да. Это процесс rsync, и он копирует файлы каждый раз. Он выводит поток на консоль, а не на файл – javagirl