Я согласен с Артуром. Мне не ясно, как это будет работать на практике, поскольку удаленная команда никогда не вернется / не завершится. Попробуйте в качестве примера следующее:
> (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
Нечто подобное. Надеюсь, это поможет.