shell 脚本监控MySQL数据库启动状态

大前提:MySQL环境要有

需求:1. 端口号和进程同时存在时才能说明MySQL进程还在

    2. 如果MySQL进程不在了 要能自动重启MySQL进程 并发出邮件通知

开始:

分步来:

(1)查MySQL 端口号还在不在的命令

 执行 :netstat -lnt | grep 3306

 输出: tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN  

使用wc -l 统计行命令:netstat -lnt | grep 3306|wc -l 如果存在返回1 不存在 返回0 Ok 监听端口号 就是这个命令了

(2)查看MySQL进程还在不在

执行:ps -ef |grep mysqld 

输出:


出现了三个进程但是我们只要一个(第二个):首先说下这三个进程出现的原因

第一个进程:因为路径中大有mysql 所以第一个线程会出现 (不建议路径中含有服务的名称 这个的话我们在查找时会带来一些麻烦)

第二个进程:MySQL服务 出现正常

第三个进程:是ps -ef..它自己的进程 

但是虽然出现了三个我们也不可能现在重新装MySQL还有解决的:

分析三个进程的特点,发现以MySQL开头的 进程才是我们需要的进程于是乎使用下面命令,把不含MySQL的过滤掉:

执行:ps -ef|grep mysqld|awk -F " "  '{ if ($1 ~ /mysql/) print  $1}'#如果第一行含有MySQL则输出$1 第一行

输出:mysql #要的就是这样的结果

使用wc -l 改成第一种端口号的方式:$(ps -ef|grep mysqld|awk -F " "  '{ if ($1 ~ /mysql/) print  $1}'|wc -l)#有返回1 没有返回0

2. 如果MySQL进程不在了 要能自动重启MySQL 如果上面两种情况有一个不符合了我们都然乌MySQL进程不在了(端口号小时,MySQL进程不在了)

分析:为了以防万一 我们在发现上面情况不符合是 先使用killall mysqld杀一次(为确保能够杀死这里会使用循环来杀直至杀死)

邮件发送:echo "conten"  mail -s "title" [email protected]

重启MySQL:/etc/init.d/mysql start

单独命令已经写出下面进行组装:

vi  monitoringDB.sh

#!/bin/sh
####################   monitoringDB   ################
##create by zyb
##create date:20151031
 isExistsPort=$(netstat -lnt | grep 3306|wc -l) #判断端口号是否存在
 isExistsThred=$(ps -ef|grep mysqld|awk -F " "  '{ if ($1 ~ /mysql/) print  $1}'|wc -l )#判断MySQL进程是否存在
 startDB=/etc/init.d/mysql#启动mysql的路径
 logPath=/server/script/info.log#日志存放地址

 if [ "$isExistsPort" -ne "1" -o "$isExistsThred" -ne "1" ]
   then
        $startDB  start >> $logPath #starting mysql db
        sleep 10
 isExistsPort=$(netstat -lnt | grep 3306|wc -l)
 isExistsThred=$(ps -ef|grep mysqld|awk -F " "  '{ if ($1 ~ /mysql/) print  $1}'|wc -l)
 if [ "$isExistsPort" -ne 1 -o "$isExistsThred" -ne "1" ]
        then
       while true
       do
          killall mysqld
          sleep 1
           [ $? -ne 0 ]&& {#如果第一次杀掉了 第二次在执行 就会报错这里 $?就不是0 了 所以不是0时我们就跳出去
                 echo "db is stoped">>$logPath
                 break
                }
        done
       $startDB start >> $logPath&&status="successful" || status="failer" #starting mysql db again
        mail -s "db status is $status" [email protected] < $logPath#发送邮件 "db status is $status“标题 $logPath 内容
    fi





你可能感兴趣的:(shell)