Запустите процесс с помощью Java, а затем завершите его

#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, чтобы вы могли быть уверены, что ваш сценарий в конечном итоге завершится через конечный промежуток времени.