大前提: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" 4123232@163.com
重启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" sunyya@163.com < $logPath#发送邮件 "db status is $status“标题 $logPath 内容
fi