2011-01-06 8 views
1

次のコードは、ファイルの末尾を決して管理しません。それは単に読者の入力を待つだけです。誰も似たようなことを試みましたか?Ganymed SSHライブラリを(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.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)))) 
     ) 
    ) 
    ) 
) 
) 

答えて

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の出力をソケットに送信し、クライアントのソケットから定期的に読み取り、ファイル出力を取得することを検討してください。リモート側でこのような何か:あなたのClojureコードで次に

tail -f filename.txt | nc -l 12000 

(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 

そのような何か。お役に立てれば。

+0

私はこのようなことを試みましたが、今私は純粋なJavaで試しています。問題は、Ganymedが無作為に切断されてしまったため、なぜその理由が分からないということでした。とにかくありがとう – Zubair

1

私は将来はそれblocks on deref until仕事は私がアーサーに同意

+0

私は未来なしでde-refを試してみましたが、それもうまくいきません – Zubair

+0

今後は使用できない場合、別のスレッドからrefをどのように変更する予定ですか?複数のスレッドから更新することができるのは、全体的な参照点ではありませんか? – Zubair

+1

実際には、将来のde-ref自体がブロックされているが、将来はde-refsではないことは間違いないと確信しています。 – Zubair

関連する問題