Answers:
查看服务器是否接受连接的最佳测试是实际尝试连接。对于服务器使用的协议,请使用常规客户端,然后尝试无操作命令。
如果您需要轻量级的TCP或UDP客户端,则可以从shell轻松驱动,请使用netcat。如何进行对话编程取决于协议。许多协议使服务器在某个输入上关闭连接,然后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
。
nc -w 2 </dev/null >/dev/null
-如果连接耗时超过2秒,它将超时并失败-这对于我的使用很方便。
nc -q 1 localhost 13000 </dev/null
如果没有服务器在侦听,@ Flyte 立即返回,但是它返回错误代码,因此循环使它进入睡眠状态,然后在几秒钟后重试。
如果您有bash和coreutils(例如超时,睡眠),但没有nc / lsof / netstat,则可以使用以下使用bash魔术tcp套接字的解决方案:
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done