获取长时间运行进程的输出流

时间:2013-03-30 03:06:10

标签: shell unix clojure

有一个长期运行的Unix进程,我想用Clojure捕获和处理输出。一个这样的过程的一个很好的例子是repl-y / nREPL会话:它的持续时间是不确定的,输出被打印到stdout。

如果我尝试(clojure.java.io/sh "lein" "repl"),评估将会阻止,直到基础流程完成,然后我可以观察输出。

这不是我想要的 - 我想立即获得一个流。

我可以使用clojure.java.io或类似的现有Clojure工具来实现这一目标吗?不介意再使用Java。

2 个答案:

答案 0 :(得分:3)

看看me.raynes.conch库,它比clojure.java.shell更通用。它low-level API似乎就是你要找的东西。

答案 1 :(得分:2)

不是详细的答案,但Clojure的sh函数的source非常短。如果你稍微重写它以删除.waitFor(或添加一个更高阶的函数来消耗它们到达时InputStreamReader返回的部分读取),你可能会得到更新的数据,因为它是由处理。但是,如果您的子进程也需要输入,请小心死锁(如lein repl示例中所示)。