为什么在clojure中使用(sh“top”时没有输出?
我试图从命令中获取输出,但没有看到任何输出为什么在clojure中使用(sh“top”时没有输出?,clojure,sh,Clojure,Sh,我试图从命令中获取输出,但没有看到任何输出 (:use [clojure.java.shell :only [sh]]) (sh "ls" "-aul"); <-- WORKS => {:exit 0, :out "total 136 -rw-r--r-- 1 snaggs staff 113 Jan 8 14:17 .babelrc drwxr-xr-x 15 snaggs staff 510 Jan 12 14:14 .
(:use [clojure.java.shell :only [sh]])
(sh "ls" "-aul"); <-- WORKS
=>
{:exit 0,
:out "total 136
-rw-r--r-- 1 snaggs staff 113 Jan 8 14:17 .babelrc
drwxr-xr-x 15 snaggs staff 510 Jan 12 14:14 .hg
(:使用[clojure.java.shell:only[sh]]
(sh“ls”-aul);
{:退出0,
:out“总计136
-rw-r--r--1斯奈格斯职员113 Jan 8 14:17.巴别LRC
drwxr-xr-x 15障碍员工510 Jan 12 14:14.hg
命令(sh“top”)
-没有输出。我知道top
命令类似于监听器。那么如何配置sh
从top
获取输出。假设tail-f
应该是相同的行为
谢谢,首先确保您在“批处理”模式下运行您的
top
,它只打印到stdout ad infinity。对于Linux和FreeBSD,这是top-b
。下一步sh
不能用于此问题,因为它等待命令完成。因此,可以通过Java中的ProcessBuilder
执行同样的操作
(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进程)
调用)
原始答案为什么(sh“top”)
未返回
严格来说,这不是Clojure问题。对于linuxtop
,您必须使用以下参数启动top
:-n1
(只有一次迭代,然后停止)和-b
(batchmode,只需写入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。首先确保您在“批处理模式”下运行您的top
版本,它只打印到stdout ad infinity。对于Linux和FreeBSD,这是top-b
。下一步sh
不能用于此问题,因为它等待命令完成。因此,可以通过Java中的ProcessBuilder
执行同样的操作
(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进程)
调用)
原始答案为什么(sh“top”)
未返回
严格来说,这不是Clojure问题。对于linuxtop
,您必须使用以下参数启动top
:-n1
(只有一次迭代,然后停止)和-b
(batchmode,只需写入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。您希望(sh“top”)做什么
应该返回吗?@OlegTheCat字符串作为进程:总共325个,2个正在运行,323个正在休眠,2224个线程….
将top-l 1
执行此任务吗?您希望(sh“top”)得到什么
应返回?@OlegTheCat字符串作为进程:总共325个,2个正在运行,323个正在睡眠,2224个线程….
将top-l 1
执行此任务吗?在macOS上,应使用top
的日志记录模式:(sh“top”“-l”“1”)
在FreeBSDtop
上单独运行就足够了,因为它检测不到终端。但为了安全起见,请使用top-b
。@cfrick我知道如何运行一个实例,但我需要继续执行任务,比如tail-f
。也许我需要使用streamsOn macOS,top
的日志记录模式应该改为:(sh“top”“-l”“1”)
在FreeBSDtop
上单独运行就足够了,因为它检测到没有终端。但为了安全起见,请使用top-b
。@cfrick我知道如何运行一个实例,但我需要继续执行任务,如tail-f
。也许我需要使用streams