以下代码永远不会设法拖尾文件。它只是等待读者输入。有没有人尝试过类似的东西?
(def output (ref [] ))
(import 'ch.ethz.ssh2.Connection)
(import 'ch.ethz.ssh2.Session)
(import 'ch.ethz.ssh2.StreamGobbler)
(import 'java.lang.StringBuilder)
(import 'java.io.InputStream)
(import 'java.io.BufferedReader)
(import 'java.io.InputStreamReader)
(let [connection (new Connection "hostname")]
(. connection connect)
(let [ok (. connection authenticateWithPassword "username" "password" )
session (. connection openSession )]
(. session execCommand "tail -f filename.txt")
(let [sb (StringBuilder.)
stdout (StreamGobbler. (. session getStdout))
br (BufferedReader. (InputStreamReader. stdout))
]
(future (loop [line2 (. br readLine)]
(if (= line2 nil)
nil
(do
(dosync (ref-set output (conj @output line2)))
(recur (. br readLine))))
)
)
)
)
)
答案 0 :(得分:2)
我同意亚瑟。我不清楚这在实践中是如何工作的,因为远程命令永远不会返回/完成。请尝试以下示例:
> (defn never-returns []
(while true
(do (Thread/sleep 2000)
(println "i'm never going to finish")))
"done")
> (def x (future (never-returns)))
> (@x)
i'm never going to finish
i'm never going to finish
...
我认为一种可能更好的方法是将线程带出客户端,同时提供一种异步访问文件尾部的方法。例如,您可以考虑使用netcat将tail -f的输出发送到套接字,然后定期从客户端中的该套接字读取以获取文件输出。在偏远的一面是这样的:
tail -f filename.txt | nc -l 12000
然后在你的clojure代码中:
(import '(java.net ServerSocket Socket))
(def client (java.net.Socket. "hostname" 12000))
(def r (java.io.BufferedReader. (java.io.InputStreamReader. (.getInputStream client))))
(println (.readLine r)) ; or capture the output
这样的事情。希望这会有所帮助。
答案 1 :(得分:1)
我不确定未来是启动工作线程的最佳构造,因为blocks on deref until工作已经完成