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

  
  
  
  
  1. 主要用于监控 linux 服务器负载及内存占用,如 MySQl、php-fpm,当负载或内存占用达到设置值后,便自动重启该进程以避免宕机。 
  2.  # 设置最大内存占用百分比  
  3. PID_MEM_MAX="85" 
  4.    
  5. # 设置最大系统负载  
  6. SYS_LOAD_MAX="3" 
  7.    
  8. # 设置需要监控的服务名称  
  9. NAME_LIST="php-fpm mysql" 
  10.    
  11. for NAME in $NAME_LIST  
  12. do 
  13.     # 初始化内存统计  
  14.     PID_MEM_SUM=0  
  15.    
  16.     # 获取该程序总进程数  
  17.     PID_NUM_SUM=`ps aux | grep $NAME | wc -l`  
  18.    
  19.     # 列出每个进程内存占用百分比  
  20.     PID_MEM_LIST=`ps aux | grep $NAME | awk '{print $4}'`  
  21.    
  22.     # 计算所有进程总内存占用  
  23.     for PID_MEM in $PID_MEM_LIST  
  24.     do 
  25.         PID_MEM_SUM=`echo $PID_MEM_SUM + $PID_MEM | bc`  
  26.     done 
  27.    
  28.     # 获取最近一分钟系统负载  
  29.     SYS_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`  
  30.    
  31.     # 比较内存占用和系统负载是否超过阀值  
  32.     MEM_VULE=`awk 'BEGIN{print('"$PID_MEM_SUM"'>='"$PID_MEM_MAX"'?"1":"0")}'`  
  33.     LOAD_VULE=`awk 'BEGIN{print('"$SYS_LOAD"'>='"$SYS_LOAD_MAX"'?"1":"0")}'`  
  34.    
  35.     # 如果系统内存占用和系统负载超过阀值,则进行下面操作。  
  36.     if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then 
  37.         #  写入日志  
  38.         echo $(date +"%y-%m-%d %H:%M:%S""killall $NAME" "(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)">> /var/log/autoreboot.log  
  39.         # 正常停止服务  
  40.         /etc/init.d/$NAME stop  
  41.         sleep 3  
  42.         # 强制关闭  
  43.         pkill $NAME  
  44.    
  45.       #  重启  
  46.         /etc/init.d/$NAME start  
  47.       #写入日志  
  48.         echo $(date +"%y-%m-%d %H:%M:%S""start $NAME" "(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)" >> /var/log/autoreboot.log  
  49.     else 
  50.         echo "$NAME very health!(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)" > /dev/null 
  51.     fi 
  52. done 
  53.   
  54. 以上代码保存为一个文件,例如:auto_reboot.sh 
  55.  
  56. 添加计划任务,设置每分钟检查一次 
  57.  
  58. crontab -e 
  59. * * * * * /bin/bash/root/auto_reboot.sh 
  60.  
  61. 注意文件的位置要搞正确。 
  62.  
  63. 请确保您的Linux系统中已经安装了bc,否则会出现错误。查看是否安装了bc可以使用命令: 
  64.  bc -v 
  65.   
  66. 如果没有安装,centos可以用 yum -y install bc 安装它 
  67. 可以使用命令 
  68.  sh /bin/bash/root/auto_reboot.sh 
  69. 测试以上脚本,如果出现 syntax error near unexpected token `do 这样的错误请查看本站文章《Linux 下sh脚本执行时出现 syntax error near unexpected token `do 错误的解决方法 》一文。 
  70.  
  71. CentOS VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本: 
  72.  
  73.  #!/bin/sh  
  74. #usage: */2 * * * * root /root/checkload.sh  
  75. # [CentOS]VPS服务器根据CPU负载及内存占用自动重启脚本  
  76. # 设置最小剩余内存,一般至少要剩余50M可用(单位兆)  
  77. FREE_MEM_MIN="50" 
  78. # 设置最大系统负载  
  79. SYS_LOAD_MAX="3" 
  80. # 设置重启服务的最小剩余内存(单位兆)  
  81. RESTART_FREE_MEM_MIN="500" 
  82. # 设置需要监控的服务名称  
  83. NAME_LIST="httpd mysqld" 
  84. for NAME in $NAME_LIST  
  85. do 
  86.     # 获得剩余内存(单位兆)  
  87.     FREE_MEM=`free -m|grep Mem|awk '{print $4}'`  
  88.     # 获得已用内存(单位兆)  
  89.     #FREE_MEM=`free -m|grep Mem|awk '{print $3}'`  
  90.     # 获取最近一分钟系统负载  
  91.     SYS_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`  
  92.     # 比较内存占用和系统负载是否超过阀值  
  93.     MEM_VULE=`awk 'BEGIN{print('"$FREE_MEM"'<'"$FREE_MEM_MIN"'?"1":"0")}'`  
  94.     LOAD_VULE=`awk 'BEGIN{print('"$SYS_LOAD"'>='"$SYS_LOAD_MAX"'?"1":"0")}'`  
  95.        
  96.     # 测试结果  
  97.     #LOAD_VULE="1"  
  98.     #echo $(date +"%y-%m-%d %H:%M:%S""DEBUG $NAME" "(FREE_MEM:$FREE_MEM|$MEM_VULE,LOAD:$SYS_LOAD|$LOAD_VULE)">> /var/log/autoreboot_debug.log  
  99.        
  100.        
  101.     # 如果系统内存占用和系统负载超过阀值,则进行下面操作。  
  102.     if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then 
  103.         #  写入日志  
  104.         echo $(date +"%y-%m-%d %H:%M:%S""killall $NAME" "(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)">> /var/log/autoreboot.log  
  105.         # 正常停止服务  
  106.         service $NAME stop  
  107.         sleep 3  
  108.         # 强制关闭  
  109.         skill $NAME  
  110.       #  重启  
  111.         sleep 10  
  112.  for i in 1 2 3  
  113.  do 
  114.   FREE_MEM=`free -m|grep Mem|awk '{print $4}'`  
  115.   MEM_VULE=`awk 'BEGIN{print('"$FREE_MEM"'>='"$RESTART_FREE_MEM_MIN"'?"1":"0")}'`  
  116.   if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]  
  117.   then 
  118.    service $NAME start  
  119.    sleep 15  
  120.    echo "AutoStart:" $(date +"%y-%m-%d %H:%M:%S""start $NAME" `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log  
  121.   fi 
  122.  done 
  123.     
  124.       # 写入日志  
  125.         echo $(date +"%y-%m-%d %H:%M:%S""start $NAME" "(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)" >> /var/log/autoreboot.log  
  126.     else 
  127.  MEM_VULE=`awk 'BEGIN{print('"$FREE_MEM"'>='"$RESTART_FREE_MEM_MIN"'?"1":"0")}'`  
  128.  if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]  
  129.  then 
  130.   service $NAME start  
  131.   sleep 15  
  132.   echo "AutoStart:" $(date +"%y-%m-%d %H:%M:%S""start $NAME" `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log  
  133.  else 
  134.   echo "$NAME very health!(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)" > /dev/null 
  135.  fi 
  136.     fi 
  137. done 
  138.   

 

你可能感兴趣的:(linux,职场,自动化,休闲,vps服务器)