Есть ли способ направить вывод длинной команды Groovy execute () на консоль, а не ждать ее завершения? - PullRequest
0 голосов
/ 03 января 2019

Я запускаю команду оболочки через системный скрипт Groovy.Это длительный процесс, около 30 минут, и он довольно многословный.Но, как написано, команда ожидает завершения команды перед печатью stdout или stderr.Есть ли способ заставить вывод идти на консоль по мере выполнения скрипта (как это было бы в терминальной сессии).

def sout = new StringBuffer(), serr = new StringBuffer()
def proc = "/some/long/running/command".execute()

proc.consumeProcessOutput(sout, serr)
println "STDOUT\n $sout"
println "STDERR\n $serr"

Обновление: это код, который я пытаюсь на основе ответа.Он ничего не печатает, пока процесс не завершится или не будет уничтожен.

def cmd = "/home/adam/test.sh"
StringBuffer sout = new StringBuffer()
StringBuffer serr = new StringBuffer()
def process = cmd.execute()
process.waitForProcessOutput sout, serr
sout.each 
   println "Line ${it}"
}

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Хотя решение, которое вы нашли, вероятно, будет работать нормально, я думаю, что лучше использовать waitForProcessOutput, что также позволяет выводить вывод ошибок процесса.

Полное решениебыло бы что-то вроде этого:

#!/usr/bin/env groovy
Process proc = "ping -c 10 google.com".execute()
proc.waitForProcessOutput(System.out, System.err)
System.exit(proc.exitValue())

Есть несколько альтернатив этому методу, например, для захвата только нормального вывода или только вывода ошибки.Вы можете найти их здесь .

Существует также (довольно короткая) глава о выполнении внешних процессов в Groovy docs .

0 голосов
/ 03 января 2019

Это было решение, которое я нашел.

proc.in.eachLine { line -> println line }
proc.out.close()
proc.waitFor()
...