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
}
Sì, funziona benissimo! Per qualche motivo mi aspettavo un po 'di magia nel metodo execute(), non sull'oggetto Process che ti restituisce. Grazie! –