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