socat - 在使用fork选项时终止STDIN EOF

时间:2016-08-19 02:05:02

标签: socat

我使用 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 也终止了。我想要的是什么?

1 个答案:

答案 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