У меня нерегулярно запущенная программа, которая выводит строку, мне нужно отправить этот вывод в какой-то сокет, который может быть распределен из контейнера докеров и который может прослушиваться несколькими слушателями или даже ни одним.
Я знаю стандартный именованный канал 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