我正在努力使一个gawk程序充当一个简单的服务器,绑定到网络套接字并回答查询。
到目前为止我的脚本是这样的:
#!/usr/local/bin/gawk
BEGIN {
s="nc -l 10.0.0.21 2345";
while (s |& getline inp) {
print inp;
print "Response to " inp |& s;
}
}
你会注意到我使用netcat
而不是gawk的内部网络?从我对文档的阅读中,理论上我应该能够设置s="/inet/tcp/2345/0/0";
让gawk绑定到端口2345上的每个本地IP地址,但是如果我想绑定到只是一个IP(在多IP主机上),我需要使用像我所做的那样的东西。此外,当我测试/inet/tcp/...
符号时,我无法使其工作。该脚本将运行,并等待输入,但它似乎没有绑定到套接字,因此它不会得到任何输入。
所以......在netcat替代方案正常工作的情况下,我的问题是...... 在客户端关闭连接后如何让服务器继续运行?
使用上面的代码,我可以连接并发送多条获得响应的行,但是一旦客户端断开连接,服务器也会退出。
我收集这是因为nc
命令行关闭了输入流,因此结束了while循环,但在我看来,while循环应该继续重新打开s
变量再次作为协同过程。
如何使这项工作?如果我可以使用/inet/tcp/...
表示法,这不会成为问题吗?我应该将整个gawk脚本包装在一个只在出口处重新运行的shell脚本中吗?或者我应该将内部while循环包含在另一个while循环中吗?或其他什么?
我尝试用这个替换while循环的调用:
...
while (1) {
s |& getline inp;
print inp;
...
但它以完全相同的方式退出。
感谢您的帮助。
答案 0 :(得分:2)
使用GNU netcat
,您可以使用-k
选项在客户端连接关闭后保持服务器正常运行。请参阅the manual。
答案 1 :(得分:0)
回答为什么你的while
解决方案不能像你在上面的答案的评论中所说的那样工作,在awk中执行外部命令(command | getline...
)要求它们在被再次调用之前被“关闭” (或者这将尝试继续读取原始调用的输出 - 即使进程终止 - )。
您必须检测执行完成的时间(getline什么都不读)并执行close(s)
。只有在执行close
后,s | getline
才会运行该命令的新实例。