我需要一个命令来等待进程开始接受特定端口上的请求。
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
继前面的例子使用bash
TCP 套接字魔法,这是一个增强版本,它在有限的时间内等待连接。
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
和端口。