2009-08-27 31 views
6

我想在我的Grails應用程序中啓動一個長時間運行的命令行進程,當輸出到達時將每行輸出記錄到控制檯,並且異步執行其他任務,同時進程和日誌記錄活動繼續進行。 (在某些情況下,我會希望對每行輸出做一些其他操作,例如登錄到文件或查找某些值並觸發其他操作,但對於此問題,登錄到控制檯很合適。)Groovy記錄進程輸出的方法

下面是我想要做到這一點的代碼。它的工作,但開始logger線程沒有明確終止它讓我困擾 - 它會正常終止嗎?它能成爲殭屍嗎?我寧願告訴Groovy將流程輸出直接發送到System.out流 - 類似command.execute(outputStream=System.out) - 但還沒有找到非阻塞的方式來做到這一點。你能建議一個更好的方法嗎?

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 
} 

回答

11

望着Groovy docs for Process,我看到有一個方法consumeProcessOutput(OutputStream的輸出,OutputStream的錯誤)。我試圖重寫你的方法通過以下方式,希望這將是非阻塞:

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 
} 

當我用命令「目錄」跑了它在Windows XP中,我得到了以下的輸出:

requested consume output 
file1 file2 ... 

成功! :)

+0

是的,這很好!出於某種原因,我期待着execute()方法中的一些魔力,而不是它返回的Process對象。謝謝! – 2009-08-28 10:39:12