2012-07-20 8 views
11

Tengo un script de Groovy que recurre a través de un directorio en busca de archivos .png, e invoca pngquant (una utilidad de línea de comandos) en cada uno de. La salida de pngquant debe imprimirse en el terminal. El código en cuestión es:capture process output in Groovy

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)   
    } 
} 

El script funciona bien, pero una vez que todos los archivos se han procesado, parece que la cerveza negra está siendo redirigido, porque el símbolo del sistema no aparece nunca a no ser que mato el proceso con Ctrl + C. ¿Es necesario que de alguna manera "deshacer"

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

o hay una mejor manera de redirigir la salida de este proceso a la consola? Supongo que podría resolver este problema simplemente agregando System.exit(0), pero esta no parece ser la solución correcta. El problema solo ocurre en Linux.

+0

¿'waitForProcessOutput (System.out, System.err)' funciona mejor? –

+0

@tim_yates sí, funciona mucho mejor, ¡muchas gracias! Si publica eso como respuesta, lo aceptaré –

Respuesta

19

En lugar de

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

que comenzará un par de hilos para leer las salidas y el arado en la independencia del proceso de situación, usted debe tratar

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

que redirigirá la salida del proceso y luego espere a que termine antes de continuar :-)

0

También puede hacer

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