Приветствую!
Ломаю голову над решением следующей задачи. Имеется программа, которая генерирует некие данные и умеет писать их либо в файл, либо в stdout. Программа может быть запущена только в одном экземпляре. Необходимо иметь возможность непрерывно писать эти данные в файл, плюс при необходимости раздавать эти данные через запущенный сервер netcat (при подключении клиента). Причем раздавать не все уже записанные в файл данные, а только те, что сгенерированы с момента подключения, то есть самые актуальные на данный момент.
В общем-то первое, что пришло на ум - писать stdout в файл и одновременно в pipe, используя tee. А этот самый пайп "скармливать" netcat-серверу. Однако если немного подумать, то получается, что при отсутствии клиента пайп моментально забьется и будет ждать, пока данные не заберут. Может быть можно как-то реализовать "плавающий" пайп, который не переполняется и в буфере которого будут только последние актуальные данные? Сильно за идею не пинайте, в юникс-системах я не силен :)
Вопрос именно общий, хотелось бы понять сам принцип решения такой задачи. Если нужна конкретика - то мучаю ее на системе wheezy-raspbian (2014-01-07), Kernel 3.10
Помогите "раздать" данные на две программы
альтернатива pipe- unix socket. более универсален. может быть nonblocking . а идеология запрос- ответ
я подобное делал еще через udp-socket типа сетевое радио- кто подключился тот и слышит
Возможно ли "напрограммирвать" unix socket через bash?
Если не сложно, тыкните в примеры таких реализаций, ничего толкового не нашел. Спасибо!
Самое близкое решение нашел тут http://stackoverflow.com/questions/7360473/linux-non-blocking-fifo-on-demand-logging (второй ответ).
Однако читать fifo в данном случае может только один процесс. А мне нужно получить некий буфер, который просто "сливает" данные вникуда, пока никто не подключился. А когда процесс подключается - он получает все эти данные. Этакий локальный broadcast-раздатчик :)
почитайте стивенса разработка сетевых приложений и взаимодействие процессов в unix . классика жанра и расписано хорошо
http://www.lainoox.com/bash-socket-programming/
чтото вроде:
while read line
do
echo $line > /dev/udp/host/port
echo $line >> logfile
doneudp не проверяет соединение просто транслирует вход на выход
http://imakemy.wordpress.com/2012/02/16/python-udp-прием-и-отправка/
а для записи в лог:
import sys
while True:
data=sys.stdih.readline()
if data=='':
break
sys.stdout.write(data) # вход на выход
sock.sendto(data,(host,port))
#sock - udp socketна питоне вообще просто