实战模拟监控MySQL服务shell脚本小结
1)端口判断法==>仅适合数据库本地使用
法1:if条件判断方法
[root@oldboyscripts]#catcheck_db01.sh #!/bin/sh #createdbyoldboy #mail:oldboy521@gmail.com PortNum=`netstat-lnt|grep3306|wc-l` if[$PortNum-eq1] then echo"mysqldisrunning." else echo"mysqldisstoped." fi
法2:条件表达式用法
[root@oldboyscripts]#catcheck_db01_1.sh #!/bin/sh #createdbyoldboy #mail:oldboy521@gmail.com PortNum=`netstat-lnt|grep3306|wc-l` #PortNum=`nmap10.0.0.189-p3306|grepopen|wc-l` [$PortNum-eq1]&&echo"mysqldisrunning."||echo"mysqldisstoped."
法3:使用系统函数显示法
[root@oldboyscripts]#catcheck_db01_2.sh #!/bin/sh #createdbyoldboy #mail:oldboy521@gmail.com #loadfunctions [-f/etc/init.d/functions]&&./etc/init.d/functions PortNum=`netstat-lnt|grep3306|wc-l` if[$PortNum-eq1] then action"mysqldisrunning."/bin/true else action"mysqldisstoped."/bin/false fi
2)进程加端口判断法==>仅适合数据库本地使用
[root@oldboyscripts]#catcheck_db02.sh #!/bin/sh #createdbyoldboy #mail:oldboy521@gmail.com PortNum=`netstat-lnt|grep3306|wc-l` ProcessNum=`ps-ef|grepmysql|grep-vgrep|wc-l` #echo$PortNum$ProcessNum #exit1 if[$PortNum-eq1-a$ProcessNum-eq2] then echo"mysqldisrunning." else echo"mysqldisstoped." fi
提示:如果不放心还可以同时加上模拟用户访问。
技巧:脚本调试技巧
1)grep过滤的字符串,不要包含在文件名里,例:grepmysql,文件名为check_mysql.sh就不太好。比较好的文件名如:
-rw-r--r--1rootroot 236Sep 922:19check_db01.sh
-rw-r--r--1rootroot 293Sep 922:34check_db02.sh
-rw-r--r--1rootroot 212Sep 922:49check_db03.sh
2)当语法没有问题但是结果不正确,可以使用下面的方法排查:
a)在变量定义的后面打印变量结果,看和实际结果是否一致,如:
echo$PortNum$ProcessNum
exit1
b)sh-xcheck_db02.sh的方式,跟踪脚本执行过程,更多的调试方案见后面的SHELL脚本调试精讲。
3)判断远端mysql服务是否正常的方法
法1:端口检查法==>适合在远端服务器使用(本地也适合)
[root@oldboyscripts]#catcheck_db03.sh #!/bin/sh #createdbyoldboy #mail:oldboy521@gmail.com PortNum=`nmap10.0.0.189-p80|grepopen|wc-l` if[$PortNum-eq1] then echo"mysqldisrunning." else echo"mysqldisstoped." fi
提示:端口的使用方法还有很多种,包括不限于下面地址的3种方法,http://oldboy.blog.51cto.com/2561410/942530
例如:还可以用nagios的check_tcp插件等法。
法2:模拟用户(包括webserver)访问方法==>适合在远端服务器使用(本地也适合)
[root@oldboyscripts]#catcheck_db04.sh #!/bin/sh #createdbyoldboy #mail:oldboy521@gmail.com mysql-S/data/3306/mysql.sock-e"selectversion();">/dev/null2>&1 if[$?-eq0] then echo"mysqldisrunning." else echo"mysqldisstoped." fi
技巧:
1)使用web连接账号模拟访问。
法3:模拟用户使用程序URL的方式判断
<?php /* #thisscriptsiscreatedbyoldboy #oldboyQQ:31333741 #site:http://www.etiantian.org #blog:http://oldboy.blog.51cto.com #oldboytrainningQQgroup:20816098722619930744246017 */ $link_id=mysql_connect('10.0.0.4','oldboy','oldboy123')ormysql_error(); if($link_id){ echo"mysqlsuccessfulbyoldboy!"; }else{ echomysql_error(); } ?>
以上的方法仅仅是简单的判断,那么下面给出一个集判断,处理,及报警于一身的较专业的mysql检查处理脚本。
4)较专业mysql检查处理脚本的解决方案
#!/bin/bash #createdbyoldboyQQ49000448 #date:20100918 MYUSER=root MYPASS="oldboy" MYSOCK=/data/3306/mysql.sock MySQL_STARTUP="/data/3306/mysql" LOG_PATH=/tmp LOG_FILE=${LOG_PATH}/mysqllogs_`date+%F`.log MYSQL_PATH=/usr/local/mysql/bin MYSQL_CMD="$MYSQL_PATH/mysql-u$MYUSER-p$MYPASS-S$MYSOCK" #→全变量定义方式,显得更专业。 $MYSQL_CMD-e"selectversion();">/dev/null2>&1 if[$?-eq0] then echo"MySQLisrunning!" exit0 else $MySQL_STARTUPstart>$LOG_FILE#→日志也是变量。 sleep5; $MYSQL_CMD-e"selectversion();">/dev/null2>&1 if[$?-ne0] then fornumin`seq10`#→通过for循环来杀死mysqld,真正杀死则退出循环或每隔个两秒杀一次,一共杀10次。 do killallmysqld>/dev/null2>&1 [$?-ne0]&&break; sleep2 done $MySQL_STARTUPstart>>$LOG_FILE fi $MYSQL_CMD-e"selectversion();">/dev/null2>&1&&Status="restarted"||Status="unknown"#→这个逻辑更准确。 echo"MySQLstatusis$Status">>$LOG_FILE mail-s"MySQLstatusis$Status"31333741@qq.com<$LOG_FILE #→把上面的Status作为结果标题传给邮件,当然你可以做短信,语音通话报警。 fi exit