2009-08-27 5 views
6

Vorrei avviare un lungo processo da riga di comando nell'applicazione Grails, registrare ogni riga di output sulla console quando arriva e fare altre cose in modo asincrono, mentre il processo e la registrazione le attività continuano. (Ad un certo punto, voglio fare qualcos'altro con ogni linea di output, come accedere a un file o cercare determinati valori e attivare altre azioni, ma la registrazione alla console va bene ai fini di questa domanda.)Modo Groovy per registrare l'output di processo

Di seguito è riportato il codice che ho creato per eseguire questa operazione. Funziona, ma l'avvio del thread logger senza interromperlo espressamente mi disturba un po '- si risolverà correttamente? può diventare uno zombie? Preferirei dire a Groovy di inviare l'output del processo direttamente allo stream System.out - qualcosa come command.execute(outputStream=System.out) - ma non ho trovato un modo non bloccante per farlo. Puoi suggerire un modo migliore?

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 
} 

risposta

11

Guardando il Groovy docs for Process, ho visto che c'era un metodo consumeProcessOutput (output OutputStream, errore OutputStream). Ho provato a riscrivere il metodo nel modo seguente, sperando che sarebbe non bloccante:

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 
} 

Quando ho eseguito su Windows XP con il comando 'dir', ho ricevuto il seguente output:

requested consume output 
file1 file2 ... 

Successo! :)

+0

Sì, funziona benissimo! Per qualche motivo mi aspettavo un po 'di magia nel metodo execute(), non sull'oggetto Process che ti restituisce. Grazie! –

Problemi correlati