WenRou's Blog
负载过高,自动重启appache
2014-4-9 温柔哥
     12号主机因为小杨的域名老是收到攻击,结果导致负载和io都很高,内存瞬间飙升至98%,结果宕机了。     所以百度了一下,弄了一个CentOS VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本。

     如下:



#!/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



sh /root/checkload.sh是尝试允许,如果没有错误值,那就可以了。

脚本中TOP_SYS_LOAD_NUM表示最大允许的系统平均负载值,当超过这一值的时候,脚本就开始重启apache服务。脚本的使用也挺简便,直接



crontab -e


运行自动任务编辑器,填入如下内容即可:


crontab -e

*/2 * * * * root /root/checkload.sh

30 3 * * * mysql-restart

35 3 * * * apache-restart



安装成功后请用 crontab -l

来查看是不是被设定好了定时执行

这里*/2,表示每二分钟执行一次指定的脚本,并将执行结果输出到/root/checkload.log文件中。你也可以根据自己的需要,来修改执行频率。

小结此脚本已经部署到我的VPS上一段时间,从使用的情况来看,效果还比较不错。



另外因为没有进行限制日志文件会一直增大,所以还是建议再添加一条删除日志LOG的定时任务

crontab -e

后面追加:



* * */7 * * rm -rf /root/checkload.log


checkload.log 这个文件会一直增大,所以要记得及时删除。

另外我个人是将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”





发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容