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

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

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

linux中有没有什么东西可以做到这一点?

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

...

答案1

查看服务器是否接受连接的最佳测试是实际尝试连接。对于服务器使用的任何协议都使用常规客户端,并尝试使用无操作命令。

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

while ! echo exit | nc localhost 13000; do sleep 10; done

您还可以告诉 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

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

while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done

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

while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done

或者您可能想要定位特定的进程 ID:

while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done

我想不出任何方法来对开始侦听套接字的进程做出反应(这将避免轮询方法),除非使用ptrace.

答案2

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

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done

答案3

前面的例子使用bashTCP 套接字魔法,这是一个增强版本,它在有限的时间内等待连接。

timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'

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

这在初始化脚本中非常有用,可以在启动后等待服务准备就绪/可用。

答案4

我用它来等待几个端口打开,没有 netcat:

while (! (: </dev/tcp/localhost/27017) &> /dev/null || ! (: </dev/tcp/localhost/9200) &> /dev/null); do
    sleep 2;
done

根据需要更改localhost和端口。

相关内容