将 linux 进程标准输出重定向到多个传入的 tcp 连接

问题描述 投票:0回答:1

我有一个工作进程,将其输出生成到标准输出管道上。

我现在想要一个服务,将该进程的标准输出回显到多个传入的 tcp 对等连接。

换句话说,我想要

  • 将进程的标准输出重定向到本地计算机的 TCP“服务器”端口
  • ...以便此 tcp 端口可以接受多个传入的 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 轮……”等条目。

linux sockets server stdout socat
1个回答
0
投票

听起来您正在寻找发布-订阅解决方案。有很多方法可以实现这一目标,例如:

Redis

制作人:

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

MQTT

制作人:

for i in {0..10000}; do echo "round ${i}"; sleep 1; done |
mosquitto_pub -t topic -l

订阅者:

mosquitto_sub -t topic"

ZeroMQ

ZeroMQ
可以通过多种方式进行配置,例如您可以在此处找到发布-订阅模式的示例实现

© www.soinside.com 2019 - 2024. All rights reserved.