博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实战模拟监控MySQL服务shell脚本小结
阅读量:6073 次
发布时间:2019-06-20

本文共 3743 字,大约阅读时间需要 12 分钟。

缘起:老男孩shell培训课上带领学生练习shell开发if语句时的几个小例子和大家分享。

)端口判断法==>仅适合数据库本地使用

if条件判断方法

[root@oldboy scripts]# cat check_db01.sh

#!/bin/sh

#created by oldboy

#mail:oldboy521@gmail.com

PortNum=`netstat -lnt|grep 3306|wc -l`

if [ $PortNum -eq 1  ]

then

   echo "mysqld is running."

else

   echo "mysqld is stoped."

fi

:条件表达式用法

[root@oldboy scripts]# cat check_db01_1.sh

#!/bin/sh

#created by oldboy

#mail:oldboy521@gmail.com

 

PortNum=`netstat -lnt|grep 3306|wc -l`

#PortNum=`nmap 10.0.0.189 -p 3306|grep open|wc -l`

[ $PortNum -eq 1  ] && echo "mysqld is running."||echo "mysqld is stoped."

:使用系统函数显示法

[root@oldboy scripts]# cat check_db01_2.sh

#!/bin/sh

#created by oldboy

#mail:oldboy521@gmail.com

#load functions

[ -f /etc/init.d/functions ] && . /etc/init.d/functions

PortNum=`netstat -lnt|grep 3306|wc -l`

if [ $PortNum -eq 1  ]

then

   action "mysqld is running." /bin/true

else

   action "mysqld is stoped." /bin/false

fi

)进程加端口判断法==>仅适合数据库本地使用

[root@oldboy scripts]# cat check_db02.sh

#!/bin/sh

#created by oldboy

#mail:oldboy521@gmail.com

 

PortNum=`netstat -lnt|grep 3306|wc -l`

ProcessNum=`ps -ef|grep mysql|grep -v grep| wc -l`

#echo $PortNum $ProcessNum

#exit 1

 

if [ $PortNum -eq 1  -a $ProcessNum -eq 2 ]

then

   echo "mysqld is running."

else

  echo "mysqld is stoped."

fi

提示:如果不放心还可以同时加上模拟用户访问。

技巧:脚本调试技巧

1grep过滤的字符串,不要包含在文件名里,例:grep mysql ,文件名为check_mysql.sh 就不太好。比较好的文件名如:

-rw-r--r-- 1 root root  236 Sep  9 22:19 check_db01.sh

-rw-r--r-- 1 root root  293 Sep  9 22:34 check_db02.sh

-rw-r--r-- 1 root root  212 Sep  9 22:49 check_db03.sh

2)当语法没有问题但是结果不正确,可以使用下面的方法排查:

   a)在变量定义的后面打印变量结果,看和实际结果是否一致,如:

     echo $PortNum $ProcessNum

     exit 1

   b) sh -x check_db02.sh的方式,跟踪脚本执行过程,更多的调试方案见后面的SHELL脚本调试精讲。

)判断远端mysql服务是否正常的方法

:端口检查法==>适合在远端服务器使用(本地也适合)

[root@oldboy scripts]# cat check_db03.sh

#!/bin/sh

#created by oldboy

#mail:oldboy521@gmail.com

PortNum=`nmap 10.0.0.189 -p 80|grep open|wc -l`

if [ $PortNum -eq 1  ]

then

   echo "mysqld is running."

else

  echo "mysqld is stoped."

fi

提示:端口的使用方法还有很多种,包括不限于下面地址的3种方法,

例如:还可以用nagioscheck_tcp插件等法。

:模拟用户(包括web server)访问方法==>适合在远端服务器使用(本地也适合)

[root@oldboy scripts]# cat check_db04.sh

#!/bin/sh

#created by oldboy

#mail:oldboy521@gmail.com

 

mysql  -S /data/3306/mysql.sock -e "select version();" >/dev/null 2>&1

if [ $? -eq 0 ]

then

   echo "mysqld is running."

else

  echo "mysqld is stoped."

fi

技巧:

1)使用web 连接账号模拟访问。

:模拟用户使用程序URL的方式判断

<?php

/*

#this scripts is created by oldboy

#oldboy QQ:31333741

#site:http://www.etiantian.org

#blog:http://oldboy.blog.51cto.com

#oldboy trainning QQ group: 208160987 226199307  44246017

*/

     $link_id=mysql_connect('10.0.0.4','oldboy','oldboy123') or mysql_error();

     if($link_id){

         echo "mysql successful by oldboy !";

     }else{

         echo mysql_error();

     }

?>

以上的方法仅仅是简单的判断,那么下面给出一个集判断,处理,及报警于一身的较专业的mysql检查处理脚本。

)较专业mysql检查处理脚本的解决方案

 
  1. #!/bin/bash  
  2. #created by oldboy QQ 49000448  
  3. #date:20100918  
  4. MYUSER=root  
  5. MYPASS="oldboy" 
  6. MYSOCK=/data/3306/mysql.sock  
  7. MySQL_STARTUP="/data/3306/mysql" 
  8. LOG_PATH=/tmp  
  9. LOG_FILE=${LOG_PATH}/mysqllogs_`date +%F`.log  
  10. MYSQL_PATH=/usr/local/mysql/bin  
  11. MYSQL_CMD="$MYSQL_PATH/mysql -u$MYUSER -p$MYPASS -S $MYSOCK" 
  12. #→全变量定义方式,显得更专业。  
  13. $MYSQL_CMD -e "select version();" >/dev/null 2>&1  
  14. if [ $? -eq 0 ]   
  15. then 
  16. echo "MySQL is running! "   
  17. exit 0  
  18. else 
  19. $MySQL_STARTUP start >$LOG_FILE#→日志也是变量。  
  20. sleep 5;  
  21. $MYSQL_CMD -e "select version();" >/dev/null 2>&1  
  22. if [ $? -ne 0 ]  
  23. then   
  24. for num in `seq 10`#→通过for循环来杀死mysqld,真正杀死则退出循环或每隔个两秒杀一次,一共杀10次。  
  25. do  
  26. killall mysqld>/dev/null 2>&1   
  27. [ $? -ne 0 ] && break;  
  28. sleep 2  
  29. done  
  30. $MySQL_STARTUP start >>$LOG_FILE   
  31. fi  
  32. $MYSQL_CMD -e "select version();" >/dev/null 2>&1 && Status="restarted" || Status="unknown"#→这个逻辑更准确。  
  33. echo "MySQL status is $Status" >>$LOG_FILE  
  34. mail -s "MySQL status is $Status" 31333741@qq.com < $LOG_FILE  
  35. #→把上面的Status作为结果标题传给邮件,当然你可以做短信,语音通话报警。  
  36. fi  
  37. exit 
更多的精彩,下次和大家再分享。

 

转载地址:http://rzngx.baihongyu.com/

你可能感兴趣的文章
待整理的每日记录
查看>>
eclipse 3.7 + subclipse1.8
查看>>
如何获取陌生服务器的IP地址
查看>>
我的友情链接
查看>>
计算机网络传输层
查看>>
PHP+MySQL全能权威指南 源代码
查看>>
AD域级别和林级别提升的好处
查看>>
我的友情链接
查看>>
装载问题-分支界限法
查看>>
中序表达式转换为逆波兰表达式
查看>>
windows git服务器
查看>>
【201期推荐】三年新医改,我们真的还是在原地踏步么?
查看>>
Bash shell的算术运算有四种方式
查看>>
HA 高可用之V2版
查看>>
获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
查看>>
记阿里云海外服务器的一次网络故障
查看>>
Linux系统检测报错
查看>>
挤公交引发的思考——公交八步曲
查看>>
科学不是战争
查看>>
10个SQL注入工具
查看>>