dav*_*vid 29 bash shell-script
我在 C++ 应用程序服务器在端口 8080 上运行的机器上运行下面的 shell 脚本,在 shell 脚本中我正在执行一个 URL 并将来自该 URL 的响应存储在 DATA 变量中。
但是假设如果同一个应用服务器宕机了,那么它将无法执行 URL,然后它会打印出来Retrying Again
并休眠 30 秒,然后再次执行相同的 URL。
#!/bin/bash
HOSTNAME=$hostname
DATA=""
RETRY=15
echo $HOSTNAME
while [ $RETRY -gt 0 ]
do
DATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/beat)
if [ $? -eq 0 ]
then
break
else
echo "Retrying Again" >&2
# restart the server
let RETRY-=1
sleep 30
fi
done
echo "Server is UP"
Run Code Online (Sandbox Code Playgroud)
这HOSTNAME
是我运行上述 shell 脚本的服务器的本地主机名。
问题陈述:-
现在我要做的是,如果服务器关闭,那么它会打印出来,然后Retrying Again
我想检查端口8080
是否打开$HOSTNAME
。如果没有,那么这意味着服务器已关闭,所以我想通过执行此命令来重新启动服务器,然后休眠 30 秒,如上面的 shell 脚本所示。
/opt/app/test/start_stop.sh start
Run Code Online (Sandbox Code Playgroud)
这可以在我上面的 shell 脚本中完成吗?
我在 Ubuntu 12.04 上运行这个 shell 脚本。
Vol*_*gel 34
该程序lsof
允许您检查哪些进程正在使用哪些资源,如文件或端口。
要显示哪些进程正在侦听端口 8080:
lsof -Pi :8080 -sTCP:LISTEN
在您的情况下,您想测试一个进程是否正在侦听 8080 - 此命令的返回值会告诉您这一点。它还打印进程的pid。
lsof -Pi :8080 -sTCP:LISTEN -t
如果您只需要测试而没有输出,请将其重定向到/dev/null
:
if lsof -Pi :8080 -sTCP:LISTEN -t >/dev/null ; then
echo "running"
else
echo "not running"
fi
Run Code Online (Sandbox Code Playgroud)
如果在本地使用具有多个 IP 地址的多个主机名,也请指定主机名
lsof -Pi @someLocalName:8080 -sTCP:LISTEN
R J*_*R J 22
bash 中最简单的方法。测试您的端口是否打开。
(echo >/dev/tcp/localhost/8080) &>/dev/null && echo "TCP port 8080 open" || echo "TCP port 8080 not open"
Run Code Online (Sandbox Code Playgroud)
用您正在测试的端口替换端口。
或者你可以使用 nc。
nc -vz 127.0.0.1 8080
Run Code Online (Sandbox Code Playgroud)
返回:
连接到 127.0.0.1 8080 端口 [tcp/*] 成功
小智 6
详细说明 RJ 的答案,其中注释nc
也很有用...不仅nc
对快速命令行查询有用
? nc -z -v -w5 127.0.0.1 8080
localhost [127.0.0.1] 8080 (http-alt) : Connection refused
Run Code Online (Sandbox Code Playgroud)
但是如果人类可读性不是您所追求的,它可以在没有 -v 的情况下使用 - 例如,用于脚本(退出代码将指示端口是打开还是关闭)。
? nc -z 127.0.0.1 8080
? echo $?
1
Run Code Online (Sandbox Code Playgroud)