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...
Надеюсь, это поможет.