Как завершить или завершить процесс после определенного количества времени в Groovy? - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь выполнить команду и хочу, чтобы процесс завершил или завершил ее через определенное время (например, через 20 минут).Это то, что я пробовал до сих пор:

def proc =["/bin/sh", "-c","command"].execute()
proc.waitFor(1200, TimeUnit.SECONDS)
StringBuffer outputStream = new StringBuffer()
proc.waitForProcessOutput(outputStream, System.err)
String output = outputStream.toString()

Несмотря на то, что я установил proc.waitFor(1200, TimeUnit.SECONDS), процесс не останавливается и продолжает выполнение через 20 минут.Как я могу это исправить?

1 Ответ

0 голосов
/ 09 июня 2018

Groovy предоставляет вызов метода Process.waitForOrKill(long numberOfMillis), который можно использовать для имитации времени ожидания процесса.Этот метод делает то, что он говорит - он ожидает завершения процесса в течение определенного промежутка времени или иным образом разрушает процесс.Стоит отметить, что если процесс был остановлен из-за тайм-аута, поток закрылся, и вы получите IOException при попытке прочитать с него (включая проверку, доступен ли поток с proc.inputStream.available()).Вот почему важно запускать такой код в try-catch.

Рассмотрим следующий пример:

import java.time.LocalTime

try {
    println "[${LocalTime.now()}] Start..."

    def proc = ["/bin/sh", "-c", "sleep 5s && echo 'test'"].execute()

    proc.waitForOrKill(2 * 1000)

    def output = proc.text?.trim()

    println "[${LocalTime.now()}] Output = ${output}"

} catch (IOException e) {
    System.err.println("[${LocalTime.now()}] Process killed before completing!")
} finally {
    println "[${LocalTime.now()}] End..."
}

Это очень простой процесс, который спит в течение 5 секунд и выводит «test» на консоль.В этом примере я даю этому процессу 2 секунды для завершения, что приводит к сбою этого процесса до его завершения:

[08:30:04.116] Start...
[08:30:06.198] Process killed before completing!
[08:30:06.214] End...

Но если я увеличу время ожидания, скажем, до 10 секунд, процесс завершится успешно примерно через 5 секунд:

[08:30:39.582] Start...
[08:30:44.655] Output = test
[08:30:44.656] End... 

Надеюсь, это поможет.

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