Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在clojure中使用(sh“top”时没有输出?_Clojure_Sh - Fatal编程技术网

为什么在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问题。对于linux
top
,您必须使用以下参数启动
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问题。对于linux
top
,您必须使用以下参数启动
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”)
在FreeBSD
top
上单独运行就足够了,因为它检测不到终端。但为了安全起见,请使用
top-b
。@cfrick我知道如何运行一个实例,但我需要继续执行任务,比如
tail-f
。也许我需要使用streamsOn macOS,
top
的日志记录模式应该改为:
(sh“top”“-l”“1”)
在FreeBSD
top
上单独运行就足够了,因为它检测到没有终端。但为了安全起见,请使用
top-b
。@cfrick我知道如何运行一个实例,但我需要继续执行任务,如
tail-f
。也许我需要使用streams