有一个长期运行的Unix进程,我想用Clojure捕获和处理输出。一个这样的过程的一个很好的例子是repl-y / nREPL会话:它的持续时间是不确定的,输出被打印到stdout。
如果我尝试(clojure.java.io/sh "lein" "repl")
,评估将会阻止,直到基础流程完成,然后我可以观察输出。
这不是我想要的 - 我想立即获得一个流。
我可以使用clojure.java.io或类似的现有Clojure工具来实现这一目标吗?不介意再使用Java。
答案 0 :(得分:3)
看看me.raynes.conch库,它比clojure.java.shell更通用。它low-level API似乎就是你要找的东西。
答案 1 :(得分:2)
不是详细的答案,但Clojure的sh
函数的source非常短。如果你稍微重写它以删除.waitFor
(或添加一个更高阶的函数来消耗它们到达时InputStreamReader
返回的部分读取),你可能会得到更新的数据,因为它是由处理。但是,如果您的子进程也需要输入,请小心死锁(如lein repl
示例中所示)。