我需要x
在服务器上调用一个程序富来自客户端酒吧。程序x
需要一些时间来加载,然后从 stdin 读取输入并将输出传输到 stdout,然后终止。我一直在尝试使用socat
它来实现这一点。
在服务器上富我进行了如下设置:
socat -lmlocal2 TCP-LISTEN:4444,fork,reuseaddr,linger=6 SYSTEM:x
为了调用命令,我在客户端运行此命令酒吧:
echo "someinput" | socat - TCP:foo:4444
当我使用 -v 运行客户端时,我可以看到socat
正在将数据传输到富,如果我top
继续富我可以看到它正在调用x
(启动需要一段时间),但是客户端酒吧无需等待x
完成,socat
在服务器上富报告 I/O 错误。
如果我改变SYSTEM
命令富到"SYSTEM:sleep 5; cat > /tmp/test ; echo 'done'"
,无论我发送多少输入,它都能正确读取并将其放入/tmp/test
。输入全部通过网络传输并馈送到x
,只是 的输出x
丢失了。
如何让socat
客户端保持打开状态直到x
完成写入 stdout 并关闭它?我尝试添加linger=6
到服务器,但没有帮助。
答案1
好的,我想我已经找到了:-t 10
在两个客户端上都安装和服务器,并且它们都将在收到客户端的 EOF 之后等待 10 秒,然后再关闭两个套接字。
专家提示:使用大量内容-d
来了解 socat 在幕后所做的事情,并创建一个可以轻松重现的简单本地测试用例。