案例:使用while守护进程的方式监控网站,每隔10秒确定一次网站是否正常。
[root@vm1 scripts]# cat url_monitor1.sh
#!/bin/bash
if [ $# -ne 1 ]
then
echo "USAGE: $0 url"
exit 1
fi
while true
do
if [ `curl -I -s -w "%{http_code}" -o /dev/null $1 |egrep -w "200|301|302"|wc -l` -ne 1 ]
then
echo "$1 is error."
else
echo "$1 is ok."
fi
sleep 4
done
可以参考curl命令的详解:
200 OK:请求成功。一般用于GET与POST请求。
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
运行结果:
[root@vm1 scripts]# sh url_monitor1.sh www.jd.com
www.jd.com is ok.
www.jd.com is ok.
www.jd.com is ok.
代码说明:
对传入的URL参数获取状态码。
一般在程序里要有退出循环的条件或者类似sleep休息的命令,否则会大量消耗系统资源。
升级示例:
使用Shell数组,同时检测多个URL是否正常。
[root@vm1 scripts]# cat url_monitor2.sh
#!/bin/bash
. /etc/init.d/functions
check_count=0
url_list=(
http://www.baidu.com
http://www.qq.com
http://www.alibaba.com
http://www.jd.com
)
check_url() {
for ((i=0;i<`echo ${#url_list[*]}`; i++))
do
wget -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1
if [ $? -eq 0 ]
then
action "${url_list[$i]}" /bin/true
else
action "${url_list[$i]}" /bin/false
fi
done
((check_count++))
}
main() {
while true
do
check_url
echo "checkcount: ${check_count}"
done
}
main
运行结果:
一些基础的函数脚本都是放在函数文件里的,例如在/etc/init.d/functions里,与执行的内容部分相分离,大型的语言程序都是这么开发的。