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
}
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! –