2009-08-27 9 views
6

Me gustaría iniciar un proceso de línea de comandos de larga ejecución en mi aplicación Grails, registrar cada línea de salida en la consola cuando llegue, y hacer otras cosas de forma asíncrona, mientras que el proceso y registro las actividades continúan. (En algún momento, querré hacer algo más con cada línea de salida, como iniciar sesión en un archivo o buscar determinados valores y desencadenar otras acciones. Pero el registro en la consola está bien para los fines de esta pregunta.)Groovy manera de registrar la salida del proceso

A continuación se muestra el código que se me ocurrió para hacer esto. Funciona, pero iniciar el hilo logger sin terminarlo expresamente me molesta un poco - ¿terminará correctamente? puede convertirse en un zombie? Prefiero decirle a Groovy que envíe la salida del proceso directamente a la secuencia System.out, algo así como command.execute(outputStream=System.out), pero no he encontrado una forma no bloqueante de hacerlo. ¿Puedes sugerir una mejor manera?

def runCommand(command) { 
    def process = command.execute() 
    def out = process.getInputStream() 
    def logger = Thread.start { out.eachLine { println it } } 
    process.waitForOrKill(TIMEOUT_IN_MILLIS) 
    return process // use to get exit code et cetera 
} 

Respuesta

11

Mirando el Groovy docs for Process, vi que había un método consumeProcessOutput (salida OutputStream, error de OutputStream). He intentado volver a escribir el método de la siguiente manera, con la esperanza de que sería sin bloqueo:

def runCommand(command) { 
    def process = command.execute() 
    process.consumeProcessOutput(System.out, System.err) 
    println 'requested consume output' //hoping this will come out first 
    process.waitForOrKill(TIMEOUT_IN_MILLIS) 
    return process // use to get exit code et cetera 
} 

Cuando me encontré con él en Windows XP con el comando 'dir', me dieron el siguiente resultado:

requested consume output 
file1 file2 ... 

¡Éxito! :)

+0

Sí, eso funciona genial! Por alguna razón, esperaba algo mágico en el método execute(), no en el objeto Process que te devuelve. ¡Gracias! –

Cuestiones relacionadas