Java process.waitFor (время, единица измерения) не истекает - PullRequest
2 голосов
/ 24 июня 2019

В моей программе 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, когда истекает время ожидания?

Любая помощь приветствуется,

1 Ответ

0 голосов
/ 24 июня 2019

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

p = pb.start()
// Everything in-between removed
if(p.waitFor(10l, TimeUnit.MILLISECONDS)) {

// Now this code is not processed in case of time out
}

Причина (см. Комментарий @TreffnonX)

Поскольку я использовал цикл while, который возвращает только ложь, когда вход закрыт. Поскольку мой ввод закрывается только после завершения процесса, моя проверка (waitFor) происходит после завершения процесса.

Другим решением может быть запуск отдельного потока, который будет запускать этот цикл while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...