Распечатать все, что происходит в процессе, в Groovy

Помогите мне, пожалуйста

Это мой код

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

def proc =["/bin/sh",      "-c","./commandx"].execute()

    proc.waitForOrKill(420 * 1000)

    def output = proc.text?.trim()

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

} catch (IOException e) {
    System.err.println("[${LocalTime.now()}] Process killed before completing! 6")
} finally {
    println "[${LocalTime.now()}] End..."
}
0
speedy 13 Сен 2018 в 19:54

2 ответа

Лучший ответ

Я думаю, вам следует использовать waitForProcessOutput:

Получает потоки вывода и ошибок из процесса и считывает их, чтобы предотвратить блокировку процесса из-за полного буфера вывода. Обработанные данные потока добавляются к предоставленному OutputStream. Для этого запускаются два потока, но join () ed, поэтому ждем. Как подразумевает имя waitFor ..., мы также ждем, пока не закончим. Наконец, потоки ввода, вывода и ошибок закрываются.

Итак, я думаю, это код, который вы ищете:

try {
    println "[${LocalTime.now()}] Start..."
    def proc =["/bin/sh", "-c", "./commandx"].execute()
    proc.waitForOrKill(420 * 1000)
    proc.waitForProcessOutput(System.out, System.err)
} catch (IOException e) {
    System.err.println("[${LocalTime.now()}] Process killed before completing! 6")
} finally {
    println "[${LocalTime.now()}] End..."
}
0
Michael 13 Сен 2018 в 17:40

Я решил с этим

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

def proc =["/bin/sh",      "-c","./commandx"].execute()

proc.in.withReader { r -> 
  r.eachLine { line -> 
    // some token processing
    println "batfile output> ${line.toUpperCase()}"
  }
}

    proc.waitForOrKill(420 * 1000)


    def output = proc.text?.trim()

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

} catch (IOException e) {
    System.err.println("[${LocalTime.now()}] Process killed before completing! 6")
} finally {
    println "[${LocalTime.now()}] End..."
}
0
speedy 13 Сен 2018 в 17:29