服务器上的网站比较多,mysqlapache经常不堪重负罢工

所以就抽了一上午学习了一些bash的语法,参考了一些类似问题解决的博客,做了一个小程序,遇到负载过高、mysql & apache关停的时候会自动重新启动mysql & apache

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/sh
#1: 80-port test
#You can Write one of your server ip here
ipaddarr=`ifconfig|grep "inet addr:"|grep -v "127.0.0.1"|head -n 1|cut -d: -f2|awk '{print $1}'`
#80 port test
PortCheck=`netstat -ant | grep ${ipaddarr}:80|grep "TIME_WAIT" &>/dev/null`
Port="$?"
httpdCheck=`ps aux|grep httpd|grep -v grep &>/dev/null`
PID="$?"
if [ "$Port" -ne "0" -o "$PID" -ne 0 ];then
http="err"
fi
#2: load average test
TOP_SYS_LOAD_NUM=10
SYS_LOAD_NUM=`uptime | awk '{print $(NF-1)}' |cut -d, -f1`
isLoad=`awk -v num1=$TOP_SYS_LOAD_NUM -v num2=$SYS_LOAD_NUM 'BEGIN{print(num1>nu
m2)?"1":"0"}'`
if [ "$isLoad" -eq 0 ]; then
load="over"
fi
#3: mysql tset
CMDCHECK=`lsof -i:3306 &>/dev/null`
Port="$?"
PIDCHECK=`ps aux|grep mysql|grep -v grep&>/dev/null`
PID="$?"
if [ "$Port" -ne "0" -o "$PID" -ne 0 ];then
mysql="err"
fi
#### restart mysql & httpd
if [[ $http == "err" ]]; then
pkill httpd
sleep 5
service httpd start
echo "#Http err@" $(date +"%y-%m-%d %H:%M:%S") "restart httpd"
fi
if [[ $load == "over" ]]; then
pkill httpd
sleep 5
service httpd start
echo "#Over load@" $(date +"%y-%m-%d %H:%M:%S") "restart httpd"
fi
if [[ $mysql == "err" ]]; then
pkill mysqld
sleep 5
service mysqld start
echo "#Mysql err@" $(date +"%y-%m-%d %H:%M:%S") "restart mysql"
fi

由于网页编码以及换行符不同,切勿直接复制使用,您可以 点击下载

或者

1
wget http://www.jeay.net/download/check_http_mysql.sh

使用方法:

  1. 设置 TOP_SYS_LOAD_NUM=10 最大负载10 超过10将重启

  2. 一些低版本的MYSQL服务为mysqld 需要替换一下源码中mysql

  3. crontab -e 编辑crontab 最后一行加入如下(注意路径)

1
*/2 * * * * root /root/check_http_mysql.sh >>/root/check.log

↑每2分钟运行一次 频率可以自行设置

crontab -l 可以查看计划任务

check.log为日志文件,每次执行重启操作将会记录一次

如果还没有安装crontab 上面第三步的无法执行,需要安装:

1
2
3
yum install vixie-cron crontabs
chkconfig crond on
service crond start