我正在努力创建一个 bash 脚本来监视 Web 服务,如果发生故障,则在 while 循环中重新启动该服务,直到它恢复 200 状态响应。
例子 :
#!/bin/bash
HTTPD=`curl -A "Web Check" -sL --connect-timeout 3 -w "%{http_code}\n" "http://127.0.0.1" -o /dev/null`
until [ "$HTTPD" == "200" ]; do
printf '.'
sleep 5
service nginx restart
done
or
while [ "$HTTPD" != "200" ];
do
service nginx restart
sleep 5
if [ "$HTTPD" == "200" ];then
break;
else
service nginx restart
fi
done
它们都像 80% 一样工作,问题是循环不会重新检查 $HTTPD 响应的状态并中断循环。
我可以在重启行后添加 HTTPD=200;,但我希望脚本检查真实的状态响应。
编辑:工作版本
#!/bin/bash
HTTPD=`curl -A "Web Check" -sL --connect-timeout 3 -w "%{http_code}\n" "http://127.0.0.1" -o /dev/null`
until [ "$HTTPD" == "200" ]; do
printf '.'
sleep 3
service nginx restart
HTTPD=`curl -A "Web Check" -sL --connect-timeout 3 -w "%{http_code}\n" "http://127.0.0.1" -o /dev/null`
done
答案1
不要重新发明轮子。很多工具已经这样做了。此外,您在脚本启动时只检查一次 Web 服务器的状态(该curl
命令不会在您每次引用 $HTTP 变量时执行,而只会在您最初定义变量时执行一次。您需要将HTTP=\
curl` 行添加到循环中。
答案2
即使在编辑中,您也会检查最外层循环中的条件。一旦满足该条件,循环就会退出。
你的描述听起来像是你想做的
while true
do
HTTPD=`curl -A "Web Check" -sL --connect-timeout 3 -w "%{http_code}\n" "http://127.0.0.1" -o /dev/null`
until [ "$HTTPD" == "200" ]; do
printf '.'
sleep 3
service nginx restart
HTTPD=`curl -A "Web Check" -sL --connect-timeout 3 -w "%{http_code}\n" "http://127.0.0.1" -o /dev/null`
done
sleep 5
done
最外层while true
是一个无限循环,只有当你终止(检查)进程时才会退出