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
继上一个使用bash
tcp sockets 魔法的示例之后,这里是一个增强版本,它在有限的时间内等待连接。
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
Run Code Online (Sandbox Code Playgroud)
不同之处在于,如果在15s
,期间连接不可用- 它不会永远循环,而是以错误代码退出。
这在 init 脚本中很有用,可以在启动后等待服务就绪/可用性。