如下:
#!/bin/sh
#usage: */2 * * * * root /root/checkload.sh
# [CentOS]VPS服务器根据CPU负载及内存占用自动重启脚本
# 设置最小剩余内存,一般至少要剩余50M可用(单位兆)
FREE_MEM_MIN="50"
# 设置最大系统负载
SYS_LOAD_MAX="3"
# 设置重启服务的最小剩余内存(单位兆)
RESTART_FREE_MEM_MIN="500"
# 设置需要监控的服务名称
NAME_LIST="httpd mysqld"
for NAME in $NAME_LIST
do
# 获得剩余内存(单位兆)
FREE_MEM=`free -m|grep Mem|awk '{print $4}'`
# 获得已用内存(单位兆)
#FREE_MEM=`free -m|grep Mem|awk '{print $3}'`
# 获取最近一分钟系统负载
SYS_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
# 比较内存占用和系统负载是否超过阀值
MEM_VULE=`awk 'BEGIN{print('"$FREE_MEM"'<'"$FREE_MEM_MIN"'?"1":"0")}'`
LOAD_VULE=`awk 'BEGIN{print('"$SYS_LOAD"'>='"$SYS_LOAD_MAX"'?"1":"0")}'`
# 测试结果
#LOAD_VULE="1"
#echo $(date +"%y-%m-%d %H:%M:%S") "DEBUG $NAME" "(FREE_MEM:$FREE_MEM|$MEM_VULE,LOAD:$SYS_LOAD|$LOAD_VULE)">> /tmp/checkload_debug.log
# 如果系统内存占用和系统负载超过阀值,则进行下面操作。
if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# 写入日志
echo $(date +"%y-%m-%d %H:%M:%S") "killall $NAME" "(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)">> /tmp/checkload.log
# 正常停止服务
service $NAME stop
sleep 3
# 强制关闭
skill $NAME
# 重启
sleep 10
for i in 1 2 3
do
FREE_MEM=`free -m|grep Mem|awk '{print $4}'`
MEM_VULE=`awk 'BEGIN{print('"$FREE_MEM"'>='"$RESTART_FREE_MEM_MIN"'?"1":"0")}'`
if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
then
service $NAME start
apache-restart
pureftpd-restart
sleep 15
echo "AutoStart:" $(date +"%y-%m-%d %H:%M:%S") "start $NAME" `ps -ef | grep $NAME | wc -l` > /tmp/checkload.log
fi
done
# 写入日志
echo $(date +"%y-%m-%d %H:%M:%S") "start $NAME" "(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)" >> /tmp/checkload.log
else
MEM_VULE=`awk 'BEGIN{print('"$FREE_MEM"'>='"$RESTART_FREE_MEM_MIN"'?"1":"0")}'`
if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
then
service $NAME start
apache-restart
pureftpd-restart
sleep 15
echo "AutoStart:" $(date +"%y-%m-%d %H:%M:%S") "start $NAME" `ps -ef | grep $NAME | wc -l` > /tmp/checkload.log
else
echo "$NAME very health!(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)" > /dev/null
fi
fi
done
输入下面的命令,然后将上面的命令行输入VI编辑器打开的checkload.sh文档
vi checkload.sh
:wq保存退出,然后:
chmod +x checkload.sh
sh /root/checkload.sh
chmod +x checkload.sh
sh /root/checkload.sh
sh /root/checkload.sh是尝试允许,如果没有错误值,那就可以了。
脚本中TOP_SYS_LOAD_NUM表示最大允许的系统平均负载值,当超过这一值的时候,脚本就开始重启apache服务。脚本的使用也挺简便,直接
脚本中TOP_SYS_LOAD_NUM表示最大允许的系统平均负载值,当超过这一值的时候,脚本就开始重启apache服务。脚本的使用也挺简便,直接
crontab -e
运行自动任务编辑器,填入如下内容即可:
crontab -e
*/2 * * * * root /root/checkload.sh
30 3 * * * mysql-restart
35 3 * * * apache-restart
*/2 * * * * root /root/checkload.sh
30 3 * * * mysql-restart
35 3 * * * apache-restart
安装成功后请用 crontab -l
来查看是不是被设定好了定时执行
这里*/2,表示每二分钟执行一次指定的脚本,并将执行结果输出到/root/checkload.log文件中。你也可以根据自己的需要,来修改执行频率。
小结此脚本已经部署到我的VPS上一段时间,从使用的情况来看,效果还比较不错。
来查看是不是被设定好了定时执行
这里*/2,表示每二分钟执行一次指定的脚本,并将执行结果输出到/root/checkload.log文件中。你也可以根据自己的需要,来修改执行频率。
小结此脚本已经部署到我的VPS上一段时间,从使用的情况来看,效果还比较不错。
另外因为没有进行限制日志文件会一直增大,所以还是建议再添加一条删除日志LOG的定时任务
crontab -e
后面追加:
crontab -e
后面追加:
* * */7 * * rm -rf /root/checkload.log
checkload.log 这个文件会一直增大,所以要记得及时删除。
另外我个人是将checkload.log文件保存到/tmp/目录下,这样重启就会自动删除
另外我个人是将checkload.log文件保存到/tmp/目录下,这样重启就会自动删除
请确保您的Linux系统中已经安装了bc,否则会出现错误。查看是否安装了bc可以使用命令:
bc -v
如果没有安装,centos可以用 yum -y install bc 安装它
可以使用命令
sh /root/checkload.sh
测试以上脚本,如果出现 syntax error near unexpected token `do 这样的错误请查看下文。
解决办法,分别实行以下命令:
vi -b back.sh
%s/^M//g
///////注意:上述命令行中的“^M”符,不是“^”再加上“M”,而是由“Ctrl+v”、“Ctrl+M”
---
转载请注明本文标题和链接:《负载过高,自动重启appache》
发表评论