首页 » VPS 知识 » 浏览内容

CentOS VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本


2011-11-13 13:34:52 3,880 0 发表评论 字体: 作者:C.K.
标签: centoslinuxVPS

体验版 88 元,个人版 128 元,多用户版 288元个人版160元升级到多用户版。
该内容仅限于会员浏览,请 登录注册
#!/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”

    本文来自:http://www.admpub.com/?post=154

      网站统计 Statistics

      • 创建时间: 2005年1月3日 距今5012 天
      • 日志总数: 2461
      • 评论总数: 630
      • 标签总数: 654
      • 链接总数: 273
      • 最后更新: 2018-8-31 17:57:04
      • 您是本站第 13942249 位访客

      广告区 Guǎng Gào