2009-08-27 12 views
6

Chciałbym rozpocząć długotrwały proces wiersza poleceń w mojej aplikacji Grails, zalogować każdą linię danych wyjściowych do konsoli, gdy nadejdzie, i robić inne rzeczy asynchronicznie, podczas gdy proces i logowanie działania wciąż idą. (W pewnym momencie będę chciał zrobić coś innego z każdą linią wyjścia, jak log do pliku lub poszukać pewnych wartości i wywołać inne akcje, ale logowanie się do konsoli jest w porządku dla celów tego pytania.)Groovy sposób rejestrowania wyjścia procesowego

Poniżej znajduje się kod, który wymyśliłem, aby to zrobić. Działa, ale uruchomienie wątku logger bez wyraźnego zakończenia go nie przeszkadza - czy zakończy się poprawnie? czy może stać się zombie? Wolałbym, aby Groovy wysłał dane wyjściowe procesu bezpośrednio do strumienia System.out - coś takiego jak command.execute(outputStream=System.out) - ale nie znalazłem nieblokującego sposobu, aby to zrobić. Czy możesz zaproponować lepszy sposób?

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 
} 

Odpowiedz

11

Patrząc na Groovy docs for Process, widziałem, że istnieje metoda consumeProcessOutput (wyjście OutputStream, błąd OutputStream). Próbowałem przepisywanie metodę w następujący sposób, mając nadzieję, że będzie bez blokowania:

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 
} 

Kiedy zabrakło go w systemie Windows XP za pomocą polecenia „dir”, mam następujący wynik:

requested consume output 
file1 file2 ... 

Sukces! :)

+0

Tak, to działa świetnie! Z jakiegoś powodu spodziewałem się magii w metodzie execute(), a nie w obiekcie Process, który ci oddaje. Dzięki! –

Powiązane problemy