2016-11-08 7 views
2

В программе Clojure, как вы читать от стандартного выхода? Я хочу сделать это или передать стандартный вывод во входной поток, который я создаю. Стандартный выход в Clojure - java.io.PrintWriter.Может ли Clojure Capture Standard выйти из существующего процесса?

У меня работа Samza, начатая программой Clojure. Там также есть сервер nrepl, к которому я могу подключиться удаленно. После подключения мне нужно иметь возможность использовать стандартную информацию (на какие задания записывать выходные данные).

1) В соответствии с этим SO question, with-out-str (см here) позволяет нам временно привязать *out*java.io.StringWriter), так что ваш исполняемый код записывает в строку. Но это не позволяет мне подключиться к существующим *out*.

2) Если вы посмотрите на clojure.java.shell (см here), он получает время исполнения JVM и Exec это процесс на нем. Из этого процесса вы можете получить стандартный поток вывода. Но опять же, это не стандарт по умолчанию (*out*), который я ищу.

3) Это SO question подходит к тому, что я пытаюсь сделать. Но опять же, я подключаюсь к существующему процессу и хочу отбросить его стандартный вывод.

Возможно ли это в Clojure (см. here)? Кто-нибудь решил это?

+0

В Linux вы можете читать из '/ proc/{pid}/fd/1', который является этапом этого процесса. Аналогично '/ proc/{pid}/fd/2' является stderr. –

+2

Вы имеете в виду, что хотите вывести выход из процесса в процесс clojure, например 'ls | my-clj' и my-clj читал вывод ls? Если это так, просто используйте http://stackoverflow.com/questions/18688755/reading-characters-from-stdin –

+0

@AlanThompson Нет, я дистанционно подключаюсь к реплике в уже запущенном процессе. После подключения, я хочу * «хвост» * стандартный вывод. – Nutritioustim

ответ

1

Выход процесса не является моделью подписки на публикацию, поэтому, когда процесс помещает символ в его выходной буфер, ровно один процесс получает, чтобы вытащить его из этого буфера. Если у вас есть программа, которая была запущена оболочкой, которая обрабатывает оболочку, если считывает ее вывод и записывает ее на терминал (или считывает и игнорирует его). Если вы присоедините свой процесс после запуска процесса и начнете пытаться захватить данные, скорее всего, вы ничего не получите, потому что родительский процесс получит его первым. Я просто попытался это из двух терминалов:

Терминал 1:

cat 

Терминал 2:

ps -ef | grep cat 
tail -f /proc/24547/fd/2 

Терминал 1:

hello 

Терминал 2: < ничего>

Строка «привет», напечатанная на терминале 1, процесс, который ее начал.

Заманчиво сказать «хорошо, если никто не читает результат, тогда он будет там для меня». В то время как это звучит хорошо, проблема в том, что это буферы фиксированного размера, поэтому, как только выходной буфер заполнен, процесс, который пытается записать на него блоки (вообще запрещен), пока кто-то не прочитает вывод для разблокировки Это.

Общее решение конвейерный процесс, который вы хотите, чтобы хвост позже к tee команда, которая записывает вывод в файл и передает его к тому, что читал его.

command-to-watch arg1 arg2 | tee logfile.potentially-huge 

Хотя, если вы идете по этому маршруту, вы должны повернуть файл журнала до того, как ваш диск заполнится. Убедитесь, что вы очистить лог-файл с этой командой точно

echo > logfile.potentially-huge 

или использовать программу, чтобы сделать truncate вызов к файлу. простое удаление файла приведет к удалению его имени из каталога журнала, не удаляя его, оно будет продолжать расти, занимая дисковое пространство, и новый файл не будет выводить результат.

В основном, мы создали логические библиотеки, такие как log4j (в 90-х годах) и syslog (в 80-х годах).

Если вы все еще хотите получить хакерское безумие на этом, перейдите к tmux, он сможет что-то сделать и изменит способ работы людей с текстом. Во всей серьезности вы должны изменить способ, которым другой процесс создает его выход, чтобы облегчить его получение.

 Смежные вопросы

  • Нет связанных вопросов^_^