如何让Ganymed SSH库跟踪文件(在Clojure中)?

如何让Ganymed SSH库跟踪文件(在Clojure中)?,clojure,Clojure,下面的代码永远无法跟踪文件。它只是挂起等待读卡器输入。有人试过类似的方法吗 (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.B

下面的代码永远无法跟踪文件。它只是挂起等待读卡器输入。有人试过类似的方法吗

(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))))
          )
      )
    )
  )
)

我不确定未来是否是开始工作线程的最佳结构,因为工作完成了

我同意Arthur的观点。我不清楚这在实践中是如何工作的,因为远程命令永远不会返回/完成。请尝试以下示例:

> (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将TRO-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

差不多吧。希望这能有所帮助。

我已经尝试了没有future的de ref,但它也不感兴趣。如果不能使用future,您应该如何更改不同线程的ref?参考文献的全部意义不在于它们可以从多个线程更新吗?事实上,我很确定未来的反参考文献本身是唯一被阻止的东西,但在未来不是反参考文献。我尝试过类似的东西,但我永远无法让它工作。现在我正在尝试纯Java。问题是Ganymed一直在随机断开连接,我不知道为什么。无论如何谢谢你