Назад | Перейти на главную страницу

Самый простой unix неблокирующий «широковещательный» сокет

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

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

Есть ли способ получить сокет этого типа с помощью "стандартных" команд Linux или демонов? Я ищу решение с наименьшим количеством зависимостей, легко обслуживаемое ...

РЕДАКТИРОВАТЬ:

Я обнаружил, что socat может работать таким образом, но я не могу поделиться сообщениями со всеми клиентами.

shell1$ socat pipe:/tmp/test-in unix-listen:/tmp/test-out,fork
shell2$ socat - UNIX-CONNECT:/tmp/test-out
shell3$ socat - UNIX-CONNECT:/tmp/test-out
shell4$ echo "test" > socat - UNIX-CONNECT:/tmp/test-in

(shell2) test

Нашел решение в аналогичном ответе https://unix.stackexchange.com/questions/195880/socat-duplicate-stdin-to-each-connected-client. Похоже, что Socat так не работает, но ncat из пакета nmap работает.

Это работает так же для сокета unix:

% mkfifo /tmp/messages-in
% exec 8<>/tmp/messages-in  # hold the fifo open
% ncat -l -U /tmp/messages-out -k --send-only < /tmp/messages-in

% echo "test" > /tmp/messages-in

% # every client connected to /tmp/messages-out will get "test" message