我有几个带有基于网络的界面的设备,我需要定期检查它们的状态。
当服务器返回 1xx(继续)、2xx(成功)或 3xx(重定向)http 状态代码时,即认为服务器正常运行。当服务器返回 4xx(客户端错误)或 5xx(服务器错误)代码或在给定时间内未响应时,即认为服务器已死。
至于获取状态代码-我已经涵盖了这一点:
curl -I http://server.domain
如何可靠地检测超时(假设我认为 5 秒太多了,但这已经足够了,因为这发生在流量很少甚至没有流量的 LAN 中)并在给定时间过去而没有响应时终止 curl 进程?或者更好的是 - 如何将它们连接起来,让一个脚本在服务器正常运行时返回 TRUE,在服务器返回错误或超时时返回 FALSE?
答案1
我同意Sven的观点,这是一个已经有现成解决方案的问题。
也就是说,您可以使用返回的退出代码curl
来确定是否发生超时。
如果 curl 超时或者服务器返回 4xx 或 5xx 状态代码,则以下脚本返回 FALSE:
HEADERS=`curl -Is --connect-timeout ${1-5} http://server.domain/`
CURLSTATUS=$?
# Check for timeout
if [ $CURLSTATUS -eq 28 ]
then
echo FALSE
else
# Check HTTP status code
HTTPSTATUS=`echo $HEADERS | grep HTTP | cut -d' ' -f2`
if [ $HTTPSTATUS -le 399 ]
then
echo TRUE
else
echo FALSE
fi
fi
此脚本接受超时参数,但默认为 5 秒。我针对一个实时 URL 进行了测试,连接超时分别为 5 秒和 0.01 秒,以演示:
# sh check_website.sh 5
TRUE
# sh check_website.sh .01
FALSE