我使用 socat 从端口上的stdin发布数据。简而言之:
some_process | socat -u - tcp-listen:8888,reuseaddr,fork
我希望管道保持活跃,因为端口8888上的读者来去,因此 fork 选项,但如果 some_process,我也希望 socat 终止死了。目前它在这种情况下仍然存在。
一个简单的测试案例是:
while : ; do echo 1; sleep 1; done | socat -u - tcp-listen:8888,reuseaddr,fork
给出了这个进程树(通过pstree):
bash─┬─bash───sleep
└─socat
如果我杀了第二个bash(正在运行while循环),那么我得到:
bash───socat
我希望 socat 也终止了。我想要的是什么?
答案 0 :(得分:1)
要回答我自己的问题,看起来我想要的东西是不可能的。
从文档(xio.help):
选项:fork
如果没有fork(或fork = 0),则侦听进程只接受一个 连接,然后终止。用叉子套装,它会分叉 每个传入连接的新socat子进程。
父进程保持在accept()和fork()调用的循环中,直到 从外面终止。
我通过将我的两个进程连接到FIFO来解决这个问题:
mkfifo /tmp/myfifo
socat -u - tcp-listen:8888,reuseaddr,fork < /tmp/myfifo &
socat_pid=$!
some_process > /tmp/myfifo
(some_process terminates for some reason)
kill $socat_pid
rm /tmp/myfifo