2009-08-27 20 views
6

Grails uygulamamda uzun süren bir komut satırı işlemini başlatmak, çıktı aldığında her bir çıktı satırını konsola kaydetmek ve diğer öğeleri eşzamansız olarak yapmak istiyorum. faaliyetler devam ediyor. (Bir noktada, bir dosyaya giriş yapmak ya da belirli değerleri aramak ve diğer eylemleri tetiklemek gibi, çıktıdaki her satır ile başka bir şey yapmak istiyorum. Ancak konsola giriş yapmak bu sorunun amaçları açısından iyidir.)İşlem çıktısını kaydetmenin en müthiş yolu

Bunu yapmak için geldiğim kod aşağıdadır. İşe yarıyor ama logger iş parçacığını açıkça sona erdirmeden başlayarak beni biraz rahatsız ediyor - düzgün bir şekilde sona erecek mi? bir zombi olabilir mi? Groovy'ye işlem çıktısını doğrudan System.out akışına - command.execute(outputStream=System.out) - gibi bir şey göndermesini söylemeyi tercih ederim, ancak bunu yapmanın engellenmeyen bir yolunu bulamadı. Daha iyi bir yol önerebilir misin? Groovy docs for Process baktığımızda

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 
} 

cevap

11

, bir yöntem consumeProcessOutput (OutputStream çıkışı, OutputStream hatası) olduğunu gördük.

requested consume output 
file1 file2 ... 
:

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 
} 

Ben komutunun 'dir' ile Windows XP üzerinde koştum, aşağıdaki çıktıyı aldım: Ben engellenmeyen olacağını umarak, şu şekilde yöntemini yeniden çalıştı

Başarı! :)

+0

Evet, bu harika çalışıyor! Bazı sebeplerden dolayı execute() yönteminde bir sihir bekliyordum, size geri verdiği Süreç nesnesinde değil. Teşekkürler! –

İlgili konular