为什么我在clojure中使用(sh" top")时没有输出?

时间:2017-01-12 12:25:44

标签: clojure sh

我尝试从sh命令获取输出但没有看到任何输出。

(sh "top")

命令top - 无输出。我知道sh命令就像是监听器。那么如何配置top以获取tail -f的输出。假设<TouchableHighlight onPress=this.login()> // yours action should go here <Image /> </ TouchableHighlight> 应该是相同的行为。

谢谢,

1 个答案:

答案 0 :(得分:3)

首先确保您在“批处理模式”下运行top版本,只是无限制地打印到stdout ad。对于Linux和FreeBSD,这是top -b。下一个sh不能用于此问题,因为它等待命令完成。所以可以通过Java的ProcessBuilder来完成同样的工作。 E.g。

(require '[clojure.java.io :as io])

; start `top -b`
(let [process (-> (ProcessBuilder. ["top" "-b"]) .start)]
  ; get the stdout of the process
  (with-open [stdout (io/reader (.getInputStream process))]
    (loop []
      ; read a line, handle it, until EOF
      (when-let [line (.readLine stdout)]
        (println line) ; work here
        (recur)))))

(注意这缺少最后的(.destroy process)电话)

原始答案(sh "top")未返回的原因

严格来说不是Clojure问题。您必须使用以下参数为top启动top-n1(仅一次迭代,然后停止)和-b(批处理模式,只需写入stdout)。其他版本可能会有所不同。

user=> (use '[clojure.java.shell :only [sh]])
nil
user=> (sh "top" "-n1" "-b")
{:err "",
 :exit 0,
 :out "top - 14:06:47 up 126 days,  5:21,  5 users,  load average: 0.93, 0.67, 1.12 ,,,

在您的示例中,您刚刚从命令行运行top。所以它开始并运行等待你退出或杀死它 - 阻止你的REPL。