生产环境监控mysql服务状态
在生产环境中,如果某个重要的服务关闭了,可能会产生不可预料的结果,这时候,我们要作一个脚本,这个脚本可以监控服务状态,在服务关闭的时候,可以自动打开服务,确保用户的利益。下面我自己写了一个监控Mysql服务的脚本,目前还没有发现bug,如果有大神发现bug的话可以和我说一下哈,本人QQ:1090139534,我也是刚刚学习的,大家可以加我和我交流。
#3306是mysqld服务的端口,看看是否是LISTEN状态。
stat="`netstat -lnt|grep 3306 |grepLISTEN`"
#判断$stat是否为空
if [ -z "$stat" ];
then
#如果为空就重启服务
/etc/init.d/mysqld restart
#判断上面的服务是否重启成功,如果失败就输出the mysql service restart fail
[ $? -ne 0 ] && echo "the mysql service restart fail"
else
#如果$stat不为空就输出the mysql service is running
echo "the mysql service is running"
fi
下面我们来实现一下。
# service mysqld status
mysqld (pid53476) 正在运行...
# service mysqld stop
停止 mysqld: [确定]
# sh db_check.sh
停止 mysqld: [确定]
正在启动 mysqld: [确定]
# sh db_check.sh
the mysql service is running
以上是我自己写的,下面这个是老师写的
#!/bin/bash
#查看3306端口有没有开启,并算出3306的行数
portNum=`netstat -lnt|grep 3306|wc -l`
#判断行数是否为0
if [ $portNum -ne 0 ];
then
#如果行数不为0就说明在运行
echo "mysql is running"
else
#如果行数为0就说明不在运行,就要重启服务
/etc/init.d/mysqld restart
fi
下面是运行效果
# service mysqld stop
停止 mysqld: [确定]
# sh db_check1.sh
停止 mysqld: [确定]
正在启动 mysqld: [确定]
#
最好就是转化为数字,老师就是这样弄的,上面之所以把脚本的名字改为db_check.sh是因为我们还有一个题目,这个题目是要查询mysql进程的,如果你的脚本里面有mysql的字眼,可能会影响结果。
一般我们写脚本的时候,可以先看看在脚本里面执行的话是什么结果,比如说,我们可以先看看mysqld服务正常启动的时候,命令ps -aux | grep mysql |wc -l和命令netstat -lnt|grep 3306 |grepLISTEN的结果是什么,这样方便我们写脚本。
# service mysqld status
mysqld (pid54334) 正在运行...
# ps -ef | grep mysql |wc -l
3
# netstat -lnt|grep 3306 |grepLISTEN
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
下面是我写的脚本,这个脚本和上面一样的功能,不同的是还要验证Mysql有没有运行进程,如果没有,还是要重启服务
#!/bin/bash
stat="`netstat -lnt|grep 3306 |grepLISTEN`"
progress="`ps -ef | grep mysql |wc -l`"
#3306是mysqld服务的端口,看看是否是LISTEN状态。
if [ -z "$stat" -a "$progress" -ne 3 ];
#判断$stat是否为空
then
/etc/init.d/mysqld restart
#如果为空就重启服务
[ $? -ne 0 ] && echo "the mysql service restart fail"
#判断上面的服务是否重启成功,如果失败就输出the mysql service restart fail
else
echo "the mysql service is running"
#如果$stat不为空就输出the mysql service is running
fi
下面是效果
# service mysqld status
mysqld (pid62274) 正在运行...
# sh db_check.sh
the mysql service is running
# service mysqld stop
停止 mysqld: [确定]
# sh db_check.sh
停止 mysqld: [确定]
正在启动 mysqld: [确定]
#
下面这个是在生产环境中脚本,可以看看
#!/bin/bash
MYSQL=/etc/init.d/mysqld
LogPath=/tmp/mysqld.log
portNum=`netstat -lnt|grep 3306|wc -l`
mysqlProcessNum=`ps -ef|grep mysqld|grep -v grep|wc -l`
if [[ $portNum -eq 1 && $mysqlProcessNum -eq 2]];then
echo "mysqld is running"
else
$MYSQL start >$LogPath
portNum=`netstat -lnt|grep 3306|wc -l`
mysqlProcessNum=`ps -ef|grep mysqld|grep -v grep|wc -l`
if [[ $portNum -ne 1 && $mysqlProcessNum -ne 2 ]];then
while true #因为有时候我们杀死一个进程可能杀不死,所以我们要不断的杀这个进程
do
killall mysqld >/dev/null 2>&1
#如果这个进程给我们杀死了,再执行这个命令时就会提示没有可以杀的进程,这样,我们杀死进程的>
命令就会执行不了了,这样$?就不等于0,这时候就说明我们已经完全杀了这个进程啦。就可以跳出这>
个循环
[ $? -ne 0 ] && break
sleep 1
done
$MYSQL start >>$LogPath && status="successful"||status="failure"
mail -s "mysql startup status is $status" 123456@qq.com &/dev/null
if [ $? -eq 0];then
echo "mysqld is running"
else
$MYSQL start >$LogPath
mysql -uroot -p123456 -e "select version();" >&/dev/null
if [ $? -ne 0];then
while true #因为有时候我们杀死一个进程可能杀不死,所以我们要不断的杀这个进程
do
killall mysqld >/dev/null 2>&1
#如果这个进程给我们杀死了,再执行这个命令时就会提示没有可以杀的进程,这样,我们杀死进程的>
命令就会执行不了了,这样$?就不等于0,这时候就说明我们已经完全杀了这个进程啦。就可以跳出这>
个循环
[ $? -ne 0 ] && break
sleep 1
done
$MYSQL start >>$LogPath && status="successful"||status="failure"
mail -s "mysql startup status is $status" 123456@qq.com &/dev/null
if [ $? -eq 0];then
echo "mysqld is running"
else
$MYSQL start >$LogPath
mysql -u$user -p$password -e "select version();" >&/dev/null
if [ $? -ne 0];then
while true #因为有时候我们杀死一个进程可能杀不死,所以我们要不断的杀这个进程
do
killall mysqld >/dev/null 2>&1
#如果这个进程给我们杀死了,再执行这个命令时就会提示没有可以杀的进程,这样,我们杀死进程的>
命令就会执行不了了,这样$?就不等于0,这时候就说明我们已经完全杀了这个进程啦。就可以跳出这>
个循环
[ $? -ne 0 ] && break
sleep 1
done
$MYSQL start >>$LogPath && status="successful"||status="failure"
mail -s "mysql startup status is $status" 123456@qq.com
页:
[1]