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

林继 VPS 知识 3,965 共写了1078个字 (2011-11-13 13:34:52) 没有评论 打印 扫描二维码 百度已收录

[level l=0,10]

下载文件
点击这里下载文件
[/level]

  1. #!/bin/sh  
  2. #usage: */2 * * * * root /root/checkload.sh  
  3. # [CentOS]VPS服务器根据CPU负载及内存占用自动重启脚本  
  4. # 设置最小剩余内存,一般至少要剩余50M可用(单位兆)  
  5. FREE_MEM_MIN="50" 
  6. # 设置最大系统负载  
  7. SYS_LOAD_MAX="3" 
  8. # 设置重启服务的最小剩余内存(单位兆)  
  9. RESTART_FREE_MEM_MIN="500" 
  10. # 设置需要监控的服务名称  
  11. NAME_LIST="httpd mysqld" 
  12. for NAME in $NAME_LIST  
  13. do 
  14.     # 获得剩余内存(单位兆)  
  15.     FREE_MEM=`free -m|grep Mem|awk '{print $4}'`  
  16.     # 获得已用内存(单位兆)  
  17.     #FREE_MEM=`free -m|grep Mem|awk '{print $3}'`  
  18.     # 获取最近一分钟系统负载  
  19.     SYS_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`  
  20.     # 比较内存占用和系统负载是否超过阀值  
  21.     MEM_VULE=`awk 'BEGIN{print('"$FREE_MEM"'<'"$FREE_MEM_MIN"'?"1":"0")}'`  
  22.     LOAD_VULE=`awk 'BEGIN{print('"$SYS_LOAD"'>='"$SYS_LOAD_MAX"'?"1":"0")}'`  
  23.  
  24.     # 测试结果  
  25.     #LOAD_VULE="1"  
  26.     #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  
  27.  
  28.  
  29.     # 如果系统内存占用和系统负载超过阀值,则进行下面操作。  
  30.     if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then 
  31.         #  写入日志  
  32.         echo $(date +"%y-%m-%d %H:%M:%S") "killall $NAME" "(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)">> /tmp/checkload.log  
  33.         # 正常停止服务  
  34.         service $NAME stop  
  35.         sleep 3  
  36.         # 强制关闭  
  37.         skill $NAME  
  38.       #  重启  
  39.         sleep 10  
  40.  for i in 1 2 3  
  41.  do 
  42.   FREE_MEM=`free -m|grep Mem|awk '{print $4}'`  
  43.   MEM_VULE=`awk 'BEGIN{print('"$FREE_MEM"'>='"$RESTART_FREE_MEM_MIN"'?"1":"0")}'`  
  44.   if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]  
  45.   then 
  46.    service $NAME start
  47.    apache-restart
  48.    pureftpd-restart
  49.    sleep 15  
  50.    echo "AutoStart:" $(date +"%y-%m-%d %H:%M:%S") "start $NAME" `ps -ef | grep $NAME | wc -l` > /tmp/checkload.log  
  51.   fi 
  52.  done 
  53.  
  54.       # 写入日志  
  55.         echo $(date +"%y-%m-%d %H:%M:%S") "start $NAME" "(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)" >> /tmp/checkload.log  
  56.     else 
  57.  MEM_VULE=`awk 'BEGIN{print('"$FREE_MEM"'>='"$RESTART_FREE_MEM_MIN"'?"1":"0")}'`  
  58.  if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]  
  59.  then 
  60.   service $NAME start  
  61.   apache-restart
  62.   pureftpd-restart
  63.   sleep 15  
  64.   echo "AutoStart:" $(date +"%y-%m-%d %H:%M:%S") "start $NAME" `ps -ef | grep $NAME | wc -l` > /tmp/checkload.log  
  65.  else 
  66.   echo "$NAME very health!(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)" > /dev/null 
  67.  fi 
  68.     fi 
  69. 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可以使用命令:

  1. bc -v

如果没有安装,centos可以用 yum -y install bc 安装它

可以使用命令

  1. sh /root/checkload.sh

测试以上脚本,如果出现 syntax error near unexpected token `do 这样的错误请查看下文。

解决办法,分别实行以下命令:

  1. vi -b back.sh
  2. %s/^M//g

///////注意:上述命令行中的“^M”符,不是“^”再加上“M”,而是由“Ctrl+v”、“Ctrl+M”

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

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

< >