如何告诉脚本等待进程开始接受端口上的请求?

Wil*_*ill 39 shell networking process open-files

我需要一个命令来等待进程开始接受特定端口上的请求。

linux中有没有这样做的东西?

while (checkAlive -host localhost -port 13000 == false)
  do some waiting

...
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 65

查看服务器是否接受连接的最佳测试是实际尝试连接。对您的服务器使用的任何协议使用常规客户端,并尝试使用 no-op 命令。

如果你想要一个轻量级的 TCP 或 UDP 客户端,你可以简单地从 shell 驱动,使用netcat。如何编程对话取决于协议;许多协议让服务器关闭某个输入的连接,然后 netcat 将退出。

while ! echo exit | nc localhost 13000; do sleep 10; done
Run Code Online (Sandbox Code Playgroud)

您也可以在建立连接后告诉 netcat 退出。如果没有连接,则返回 1,如果有连接,则返回 0,因此我们否定其输出。根据您的 netcat 版本,它可能支持以下一种或两种命令:

while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done
Run Code Online (Sandbox Code Playgroud)

另一种方法是等待服务器进程打开侦听套接字。

while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 Mac OS,netstat 使用的输出格式略有不同,因此您可能需要以下内容:

while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done
Run Code Online (Sandbox Code Playgroud)

或者您可能想要针对特定​​的进程 ID:

while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done
Run Code Online (Sandbox Code Playgroud)

除了使用ptrace.


小智 20

如果您有 bash 和 coreutils(例如超时、睡眠),但没有 nc/lsof/netstat,您可以使用这个使用 bash magic tcp 套接字的解决方案:

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
Run Code Online (Sandbox Code Playgroud)


小智 17

继上一个使用bashtcp sockets 魔法的示例之后,这里是一个增强版本,它在有限的时间内等待连接。

timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
Run Code Online (Sandbox Code Playgroud)

不同之处在于,如果在15s,期间连接不可用- 它不会永远循环,而是以错误代码退出。

这在 init 脚本中很有用,可以在启动后等待服务就绪/可用性。