2011-01-06 2 views
1

다음 코드는 파일을 꼬리로 관리하지 않습니다. 그것은 독자 입력을 기다리는 것입니다. 아무도 비슷한 것을 시도한 적이 있습니까?가니메드 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

나는 이런 식으로 시도했지만 결코 작동하지 않을 수 있습니다. 지금 나는 순수한 자바로 노력하고있다. 문제는 Ganymed가 임의의 시간에 연결을 끊어 버렸고 이유를 파악할 수 없다는 것이 었습니다. 어쨌든 고마워. – Zubair

1

나는 미래가 blocks on deref until 작업이 내가 아서에 동의

+0

미래가없는 de-ref를 시도했지만 작동하지 않습니다 – Zubair

+0

미래를 사용할 수 없다면 다른 스레드에서 ref를 어떻게 변경해야합니까? 여러 스레드에서 업데이트 할 수있는 심판의 요점이 아닌가? – Zubair

+1

사실 나는 미래의 de-ref가 차단 된 유일한 것이지만 나중에는 de-refs가 아니라는 것을 확신합니다. – Zubair

관련 문제