В моей программе Java 11 (openjdk 11.0.3 2019-04-16 под Debian) я использую ProcessBuilder для запуска внешних команд.Внешняя команда может зависнуть, поэтому мне нужно, чтобы она истекла через определенное время.
Поэтому я использую p.waitFor(time, unit)
, который должен вернуть
true, если процесс завершился, иfalse, если время ожидания истекло до завершения процесса.
ProcessBuilder pb = new ProcessBuilder(externalCommand);
// Merges the error stream with the standard output stream
pb.redirectErrorStream(true);
Process p = pb.start();
Date start = new Date();
BufferedReader br = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String tempLine;
/**
* We only want the first 10 lines otherwise it will print thousands of
* useless lines (always the same)
*/
int nbOfLinesInlogs = 10;
while ((tempLine = br.readLine()) != null) {
// We only report errors to the user
if (tempLine.toLowerCase().startsWith("error") && nbOfLinesInlogs > 0) {
Level level = Level.WARNING;
System.err.println("External command output : " + tempLine);
// There was an error
errorDetected = true;
nbOfLinesInlogs--;
}
}
if (p.waitFor(10l,
TimeUnit.NANOSECONDS)) {
long elapsedInMillis = new Date().getTime() - start.getTime();
System.err.println("External process succeeded and took " + elapsedInMillis + " ms");
// prints Externalprocess succeeded and took 15327 ms
...
}
else {
System.err.println("External process timed out");
// This is never printed!
throw new InterruptedException(
"External process timed out!");
}
Однако процесс никогда не останавливается и выдает, что прошло 15 с, хотя время ожидания должно истечь через 10 нс (это всего лишьтест, чтобы проверить, что время ожидания работает, как ожидалось).Я также пробовал мс, мс и с с тем же результатом.
Что я могу сделать, чтобы процесс возвращал значение false, когда истекает время ожидания?
Любая помощь приветствуется,