这个问题困扰许久了,因为我的阿里云服务器只有500M和1G内存,往往在网站访问量大的时候就会导致服务器的apache进程过多之后导致mysql服务被自动关闭。
其网站表现就会是数据库无法连接。之前尝试使用swap做交换区让服务器内存加大到2G,问题出现的频率就低了。但是偶尔还是会在大并发的访问下导致内存不足,so,做了一个脚本,能够自动监控服务器mysql 的状态,如果发现进程关闭就自动重启。
首先检测和重启的shell脚本代码如下:
#!/bin/bash
checkMysql(){
CMDCHECK=`lsof -i:3306 &>/dev/null`
Port="$?"
PIDCHECK=`ps aux|grep mysqld|grep -v grep`
PID="$?"
if [ "$Port" -eq "0" -a "$PID" -eq 0 ];then
return 200
else
return 500
fi
}
startMysql(){
/etc/init.d/mysql start
}
checkMysql
if [ $? == 200 ];then
echo "Mysql is running..."
else
startMysql
checkMysql
if [ $? != 200 ];then
while true
do
killall mysqld
sleep 2
[ $? != 0 ]&&break
done
startMysql
fi
fi
直接复制过去,在服务器上建立一个mysql-listen.sh的文件,
然后提高这个文件的权限
chmod 777 mysql-listen.sh
然后先检查一下这个脚本是否可用,先关闭服务器的mysql
service mysql stop
然后访问你的网址,如果出现数据库连接失败说明数据已经关闭了,然后运行这个脚本
sh mysql-listen.sh
然后看是否有信息说明服务器已经正在运行mysql且提供一个进程号。
我在这个阶段出了错误,首先是没有改权限导致并有没有权限去启动mysql,其次启动mysql的命令在不同服务器上有时候是不一样的,我的则是
/etc/init.d/mysql start
部分的可能是
/etc/init.d/mysqld start
接下来需要让这个脚本隔一段时间自动运行。
使用crontab -e在最后一行补上
#第一次使用cron,得用序号选择编辑器
这里*/5中的5 是指5分钟一次。 后面是4个*代表日,月,星期的。最后是你脚本的路径。
保存后退出。
重启cron就可以了
service cron
restart
这样就会每隔5分钟,执行一次检测mysql的脚本。
原创文章,转载请注明: 转载自URl-team
本文链接地址: shell脚本实现监控服务器mysql,解决服务器内存不足自动关闭mysql问题