我有一个工作进程,将其输出生成到标准输出管道上。
我现在想要一个服务,将该进程的标准输出回显到多个传入的 tcp 对等连接。
换句话说,我想要
stdin 管道可以忽略。
相应的问题:我可以使用一些现有的命令行实用程序来实现这一点,还是我需要自己编写一个中继器工具,例如用Python?
我使用
socat
进行了测试,它可以满足部分需求,但不能完全满足:
socat
可以将 stdout
重定向到 TCP 端口,并且它可以接受来自多个对等主机的传入连接socat
不会将 stdout
流数据完整回显到所有连接,而是每个连接以看似随机的方式接收部分 stdout
数据。仅供参考,这是我使用
socat
进行测试的方法:
一个 oneliner bash 虚拟示例,用于更新
round N
回显端口 8080 的条目:
for i in {0..10000}; do echo "round ${i}"; sleep 1; done | socat - TCP-LISTEN:8080,fork,reuseaddr
如果使用两个
nc localhost 8080
对等连接监听此示例虚拟流,两个对等点都会收到部分 stdout
流,但都不会收到全部:
连接 1 接收:
round 1
round 2
round 4
round 7
连接 2 接收:
round 3
round 5
round 6
round 8
期望两个连接都会收到所有“第 1 轮、第 2 轮、第 3 轮……”等条目。
听起来您正在寻找发布-订阅解决方案。有很多方法可以实现这一目标,例如:
制作人:
for i in {0..10000}; do echo "round ${i}"; sleep 1; done |
while read s; do printf "publish topic '%s'" "$s" | redis-cli; done
订阅者:
printf "subscribe topic\n" | redis-cli
制作人:
for i in {0..10000}; do echo "round ${i}"; sleep 1; done |
mosquitto_pub -t topic -l
订阅者:
mosquitto_sub -t topic"
ZeroMQ
可以通过多种方式进行配置,例如您可以在此处找到发布-订阅模式的示例实现。