2013-03-30 35 views
4

有一個長期運行的Unix進程,我希望用Clojure捕獲和處理輸出。一個這樣的過程的一個很好的例子是repl-y/nREPL會話:它的持續時間是不確定的,並且輸出被打印到stdout。獲取長時間運行的輸出流

如果我嘗試(clojure.java.io/sh "lein" "repl"),評估將阻塞,直到基礎過程完成,然後然後我可以觀察輸出。

這不是我想要的 - 我想立即得到一個流。

我可以使用clojure.java.io或類似的現有Clojure工具來實現嗎?不介意訴諸於Java,否則。

回答

1

不是一個詳細的答案,但source爲Clojure的sh函數是相當短的。如果稍微修改它以刪除.waitFor(或者添加更高階的函數以消耗InputStreamReader返回的部分讀取),那麼您可能會獲得更新的數據,因爲它是由進程返回的。但是,如果你的子進程也需要輸入,就要小心死鎖(如你的lein repl例子)。

3

看看me.raynes.conch庫,它比clojure.java.shell更通用一些。這是low-level API似乎是你在找什麼。

+0

剛開始使用這個。這真是棒極了! –

+0

我認爲流處理stdout需要更多的技巧,如果你想以非阻塞的方式處理輸出流,或者至少,我不知道如何用海螺完成輸出流。 – matanster