2009-08-27 16 views
6

Ich möchte einen lang laufenden Befehlszeilenprozess in meiner Grails-Anwendung starten, protokollieren jede Zeile der Ausgabe an die Konsole, wenn es ankommt, und andere Sachen asynchron, während des Prozesses und der Protokollierung Aktivitäten gehen weiter. (Irgendwann möchte ich mit jeder Zeile der Ausgabe etwas anderes machen, zum Beispiel in eine Datei loggen oder nach bestimmten Werten suchen und andere Aktionen auslösen. Aber die Anmeldung an der Konsole ist für diese Frage in Ordnung.)Groovy Weg Prozessausgabe zu protokollieren

Unten ist der Code, den ich dazu entwickelt habe. Es funktioniert, aber den logger Thread zu starten, ohne es ausdrücklich zu beenden stört mich ein bisschen - wird es richtig beenden? Kann es ein Zombie werden? Ich würde lieber Groovy sagen, Prozessausgabe direkt an den System.out-Stream zu senden - so etwas wie command.execute(outputStream=System.out) - aber habe keine blockierungsfreie Möglichkeit gefunden, dies zu tun. Können Sie einen besseren Weg vorschlagen?

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 
} 

Antwort

11

am Groovy docs for Process Sehen, sah ich, dass es ein Verfahren consumeProcessOutput (Outputleistung, Outputfehler) war. Ich habe versucht, Ihre Methode in der folgenden Weise umgeschrieben, in der Hoffnung, dass es nicht blockierend sein würde:

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 
} 

Wenn ich es unter Windows XP mit dem ‚dir‘ Befehl ausgeführt wird, bekam ich folgende Ausgabe:

requested consume output 
file1 file2 ... 

Erfolg! :)

+0

Ja, das funktioniert super! Aus irgendeinem Grund habe ich etwas Magie in der execute() -Methode erwartet, nicht auf dem Process-Objekt, das es Ihnen zurückgibt. Vielen Dank! –

Verwandte Themen