#java #processbuilder
#java #processbuilder
Вопрос:
Обычно я использую этот код для запуска скрипта bash и получения его вывода
ProcessBuilder pb = new ProcessBuilder("/home/myscript");
Process p = pb.start();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
String inputRead;
p.waitFor();
while((inputRead=stdInput.readLine()) != null){
Helper.log(inputRead);
}
Это работает нормально, но на этот раз сценарий bash, который я использую, не завершился. Он всегда активен, и когда он что-то обнаруживает, он это печатает. Я хочу запустить скрипт, подождать некоторое время, а затем проверить, обнаружил ли он что-то.
Я попробовал этот код
Thread.sleep(5000);
p.destroy();
String inputRead;
while((inputRead=stdInput.readLine()) != null){
Helper.log(inputRead);
}
Но я получаю в результате
java.io.IOException: поток закрыт
Я также пытался
p.waitFor(5, TimeUnit.SECONDS);
while((inputRead=stdInput.readLine()) != null){
Helper.log(inputRead);
}
Но процесс так и не закончился, и я все еще получаю входные данные в журнале навсегда.
Я просто хочу запустить скрипт на короткий промежуток времени, в данном примере 5 секунд, а затем остановить его и получить результат, сгенерированный скриптом за этот период.
Ответ №1:
может Process.destroy (и, вероятно, будет, но это зависит от реализации) убить ваш процесс, и именно поэтому вы получаете исключение java.io.IOException.
Если вы используете Java 8, я бы предложил использовать Process.waitFor с конструктором timeout . Вы сможете проверить, зависал ли ваш процесс или нет. Если он возвращает true , вы захватили выходные данные процесса обычными средствами. Если он возвращает false, возможно, ваш процесс завис, поэтому вы можете либо завершить его, либо подождать еще немного и попытаться посмотреть, изменилось ли что-нибудь.
Альтернативой может быть управление вашим сценарием bash с помощью команды timeout, чтобы вы могли быть уверены, что ваш сценарий в конечном итоге завершится через конечный промежуток времени.