Вывода процесса захвата в Groovy

У меня есть Groovy script, который рекурсирует через каталог, ищущий .png файлы, и вызывает pngquant (команда -line) для каждого из них. Выходной сигнал pngquant должен быть напечатан на терминале. Соответствующий код:

def command = "pngquant -f -ext .png"

root.eachFileRecurse(groovy.io.FileType.FILES) {File file ->

    if (file.name.endsWith('.png')) { 
        println "Compressing file: $file"

        def imgCommand = "$command $file.absolutePath"

        Process pngquantCmd = imgCommand.execute()
        pngquantCmd.consumeProcessOutput(System.out, System.err)        
    }
}

script работает нормально, но как только все файлы были обработаны, кажется, что все еще перенаправляется, поскольку командная строка никогда не появляется, если я не убил процесс с помощью Ctrl + C. Нужно ли мне как-то "отменить"

pngquantCmd.consumeProcessOutput(System.out, System.err)        

или есть лучший способ перенаправить вывод этого процесса на консоль? Думаю, я мог бы решить эту проблему просто добавив System.exit(0), но это не похоже на правильное решение. Проблема возникает только в Linux.

Ответ 1

Вместо

    pngquantCmd.consumeProcessOutput(System.out, System.err)        

Что будет запускать пару потоков для чтения выходов и пахать независимо от ситуации процесса, вы должны попробовать

    pngquantCmd.waitForProcessOutput(System.out, System.err)

Будет перенаправлен выход процесса, а затем дождитесь его завершения, прежде чем двигаться дальше: -)

Ответ 2

Вы также можете сделать

Process pngquantCmd = imgCommand.execute();
def output= pngquantCmd .in.text;
println("Output : " + output);