本文共 1804 字,大约阅读时间需要 6 分钟。
解决问题场景: 使用while守护进程的方式,每隔10秒确定一次网站是否正常。
脚本 website_mon.sh 如下:
#!/bin/bash. /etc/init.d/functions #引入函数库check_count=0# 定义检测的URL数组,包含多个URL地址url_list=( http://www.baidu.comhttp://www.baidu100.comhttp://127.0.0.1)function wait(){ echo -n '3秒后,执行检查URL操作.'; for ((i=0;i<3;i++)) do echo -n "."; sleep 1 done echo}function check_url() #<==定义检测URL的函数{ wait #<==执行倒计时函数 for((i=0;i<`echo ${#url_list[*]}`;i++)) #<==循环数组元素 do wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1 #<==检测是否可以访问数组元素的地址 if [ $? -eq 0 ] #<==如果返回值为0,则表示访问成功 then action "${url_list[$i]}" /bin/true #<==优雅地显示成功结果 else action "${url_list[$i]}" /bin/false #<==优雅地显示失败结果 fi done ((check_count++)) #<==检测次数+1}main(){ #<==定义主函数 while true #<==开启一个持续循环 do check_url #<==加载检测url的函数 echo "--------------check count:${check_count}-------------------" sleep 10 #<==间歇10秒 done}main #<==调用主函数运行程序
分析:
采用Shell数组的方法,同时检测多个URL是否正常,并给出专业的展示效果,是实际工作中可用的脚本。
. /etc/init.d/function引入函数库,才能够使用actoin“${url_list[$i]}” /bin/true或者action“${url_list[$i]}” /bin/false,效果如下:可以更专业的显示输出结果。
for((i=0;i<`echo${#url_list[*]}`;i++)) 这里面的echo ${#url_list[*]}为输出url_list数组的个数。
wget-o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1 这句wget的用法比较复杂,我们具体分析下:
wget-o /dev/null : wget -o 下载信息保存到指定文件中,比如:wget -o tim.zip 文件中,这里wget -o /dev/null 即将下载的内容丢到垃圾箱(/dev/null)。
--spider: 不下载任何文件
--tries=1:重试次数为1次,wget默认重试20次连接下载文件
-T3: 设置超时时间为3秒
>/dev/null2>&1: 表示标准输出和错误输出都重定向到/dev/null
其他脚本都比较容易理解。补充:
1、如何监控nginx的一个简单脚本:
脚本nginx_mon.sh如下:
#!/bin/bashif [ `netstat -tlunp|grep nginx|wc -l` -gt 0 ] #过滤进程名为mysqld,转成数字 then echo "Nginx is Running." else echo "Nginx is Stopped." /data/program/nginx/sbin/nginxfi2、上述中如果检测到异常可以用到邮件相关通知功能,见博客: 我的博客: