WenRou's Blog

新浪微薄腾讯微薄

最新碎语:测试图片碎语哦

您的位置:WenRou's Blog >lnamp> 负载过高,自动重启appache

负载过高,自动重启appache

     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”

---

转载请注明本文标题和链接:《负载过高,自动重启appache

发表评论

88 + 2 =
路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交