大家好今天给大家带来shell脚本的一个实例(检测Nginx服务是否正常运行)
需求:检测Nginx服务是否正常的运行,如果不在运行那么就启动Nginx服务器,那么如果启动Nginx失败,那么通过邮件报警的方式通知我们;
一、分析
1:监测Nginx服务是否正在运行如下:
[root@yankerp ~]# netstat -anput | grep Nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 27228/Nginx: master
使用以上这条命令能够很清楚的看到Nginx正在运行
2:启动Nginx服务器,我们可以通过它的绝对路径去启动Nginx我的Nginx安装路径为:/usr/local/Nginx其中/sbin/下就是Nginx的启动项;
怎么样可以判断Nginx启动失败,我们可以使用特殊的状态变量$?如果/usr/local/Nginx/sbin/Nginx这条命令运行之后如果启动失败那么它$?就会输出非0的数值表示失败,那么至于邮件报警的方式这里我采用了sendemail
二、编写脚本
开头注释:#!/bin/bash一句话代表着此脚本中的内容是通过bash解析器来运行的
编写脚本的规范输入时间--创建者的信息--联系邮箱地址--以及版本等等。如下:
#!/bin/bash #Date: 17:17 2018-03-04 #Author: yankai #Email: ywyankerp@163.com #Function: Nginx monitoring #Version: 3.1
2)定义变量
. /etc/init.d/functions #加载函数库,后面会用到 RED_COLOR='\E[1;31m' #定义颜色(红色变量)输出更美观 RES='\E[0m' #同上 NGX=`netstat -anput | grep Nginx | wc -l` #定义检测Nginx是否运行变量 通过wc命令获取行号 DA=`date +%Y-%m-%d` #标准的时间输出后面会用到
3)定义函数
接下来就开始写第一个函数了,首先我们写一个获取本机的URL看看是否能够成功http://localhost
function Nginx_URL(){ #定义了监测本地URL函数 wget --spider -q -o /dev/null --tries=1 -T 5 http://localhost #安静的输出---/dev/null 这里的wget参数不解释 if [ "$?" -ne 0 ] #如果以上wget获取本地的url不等于0 也就是不成功 then #那么 action "Nginx pages cannot be obtained_$DA" /bin/false >> /var/log/Nginx_url_error.log #输出一条NginxURL检测失败,那么后面调用DA时间变量输出到/var/log/Nginx_url_error.log日志中 fi #最后fi结束if语句 }
那么我们在这里想一个问题,那么如果wget获取不到本地的URL意味着Nginx可能会宕机,那么我们继续写检测Nginx是否运行的函数
function main(){ #定义总函数 Nginx_URL #调用Nginxurl函数来测试Nginx本地的url是否能够正常运行 Nginx_server #调用检测Nginx函数 来测试Nginx服务器是否正在运行 } main #最后结束main函数 function Nginx_server(){ #定义检测Nginx函数 if [ "$NGX" -ne 0 ] #$NGX这个变量的运行结果不等于0 非0代表正在运行 then #那么 echo -en "${RED_COLOR} Nginx is running!\n${RES}" #就输出Nginx is running 信息; else #否则启动Nginx /usr/local/Nginx/sbin/Nginx fi if [ "$?" -ne 0 ];then 注意:在这里需要提前安装好sendemail邮件报警 可以参考我之前的文章这里不在演示 /usr/local/bin/sendEmail -f yankerpcs@163.com -t ywyankerp@163.com -s smtp.163.com -u "Nginx alarm" -o message-content-type=html -o message-charset-utf8 -xu yankerpcs -xp 123456yk -m "Nginx has serIoUs downtime" &>/dev/null fi }
最后我们定义了两个函数同时检测Nginx的状态情况,最后我们需要定义总函数来调用以上函数进行最后的测试
function main(){ #定义总函数 Nginx_URL #调用Nginxurl函数来测试Nginx本地的url是否能够正常运行 Nginx_server #调用检测Nginx函数 来测试Nginx服务器是否正在运行 } main #最后结束main函数。
三、结尾:
经过了上面的几种操作,我们已经知道了Nginx的各种判断来确定Nginx的运行状况,同时我们也设置了邮件报警的机制来发送报警消息给运维人员。那么最后的脚本如下:
#!/bin/bash #Date: 17:17 2018-03-04 #Author: yankai #Email: ywyankerp@163.com #Function: Nginx monitoring #Version: 3.1 . /etc/init.d/functions RED_COLOR='\E[1;31m' RES='\E[0m' NGX=`netstat -anput | grep Nginx | wc -l` DA=`date +%Y-%m-%d` function Nginx_URL(){ wget --spider -q -o /dev/null --tries=1 -T 5 http://localhost if [ "$?" -ne 0 ] then action "Nginx pages cannot be obtained_$DA" /bin/false >> /var/log/Nginx_url_error.log fi } function Nginx_server(){ if [ "$NGX" -ne 0 ] then echo -en "${RED_COLOR} Nginx is running!\n${RES}" else /usr/local/Nginx/sbin/Nginx fi if [ "$?" -ne 0 ];then /usr/local/bin/sendEmail -f yankerpcs@163.com -t ywyankerp@163.com -s smtp.163.com -u "Nginx alarm" -o message-content-type=html -o message-charset-utf8 -xu yankerpcs -xp 123456yk -m "Nginx has serIoUs downtime" &>/dev/null fi } function main(){ Nginx_URL Nginx_server } main
运行测试如下:
当我们Nginx正在运行的时候我们发现它输出了Nginxisrunning说明我们定义函数生效了。
3:模仿/usr/local/Nginx/sbin/Nginx启动出错测试邮件是否发送.....
邮件查收:
最后我们要把此脚本添加到计划任务运行,在这里不在做演示!上面的Nginx启动报错大家可以自己想办法让它启动失败,这里不在做演示。
希望对您有所帮助,再见~