shoemoney

Quick Bash Website Montor

Aug 2nd, 2013
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #! /bin/bash
  2. #====================================================================
  3. # sys-mon.sh
  4. #
  5. # Copyright (c) 2011, WangYan <[email protected]>
  6. # All rights reserved.
  7. # Distributed under the GNU General Public License, version 3.0.
  8. #
  9. # Monitor system mem and load, if too high, restart some service.
  10. #
  11. # See: https://wangyan.org/blog/sys-mon-shell-script.html
  12. #
  13. # V 0.5, Date: 2011-12-08
  14. #====================================================================
  15.  
  16. # Need to monitor the service name
  17. # Must be in /etc/init.d folder exists
  18. NAME_LIST="httpd nginx mysql"
  19.  
  20. # Single process to allow the maximum CPU (%)
  21. PID_CPU_MAX="25"
  22.  
  23. # The maximum allowed memory (%)
  24. PID_MEM_SUM_MAX="95"
  25.  
  26. # The maximum allowed system load
  27. SYS_LOAD_MAX="6"
  28.  
  29. # Log path settings
  30. LOG_PATH="/var/log/sys-mon.log"
  31.  
  32. # Date time format setting
  33. DATA_TIME=$(date +"%y-%m-%d %H:%M:%S")
  34.  
  35. # Your email address
  36.  
  37. # Your website url
  38. MY_URL="http://106.187.38.210/p.php"
  39.  
  40. #====================================================================
  41.  
  42. for NAME in $NAME_LIST
  43. do
  44.     PID_CPU_SUM="0";PID_MEM_SUM="0"
  45.     PID_LIST=`ps aux | grep $NAME | grep -v root`
  46.  
  47.     IFS_TMP="$IFS";IFS=$'\n'
  48.     for PID in $PID_LIST
  49.     do
  50.         PID_NUM=`echo $PID | awk '{print $2}'`
  51.         PID_CPU=`echo $PID | awk '{print $3}'`
  52.         PID_MEM=`echo $PID | awk '{print $4}'`
  53. #       echo "$NAME: PID_NUM($PID_NUM) PID_CPU($PID_CPU) PID_MEM($PID_MEM)"
  54.  
  55.         PID_CPU_SUM=`echo "$PID_CPU_SUM + $PID_CPU" | bc`
  56.         PID_MEM_SUM=`echo "$PID_MEM_SUM + $PID_MEM" | bc`
  57.  
  58.         if [ `echo "$PID_CPU >= $PID_CPU_MAX" | bc` -eq 1 ];then
  59.             if [[ "$NAME" = "php-fpm" || "$NAME" = "httpd" ]];then
  60.                 sleep 5
  61.                 if [ `echo "$PID_CPU >= $PID_CPU_MAX" | bc` -eq 1 ];then
  62.                     echo "${DATA_TIME}: kill ${NAME}($PID_NUM) successful (CPU:$PID_CPU)" | tee -a $LOG_PATH
  63.                     kill $PID_NUM
  64.                 fi
  65.             else
  66.                 echo "${DATA_TIME}: [WARNING!] ${NAME}($PID_NUM) cpu usage is too high! (CPU:$PID_CPU)" | tee -a $LOG_PATH
  67.             fi
  68.         fi
  69.     done
  70.     IFS="$IFS_TMP"
  71.  
  72.     SYS_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
  73.     SYS_MON="CPU:$PID_CPU_SUM MEM:$PID_MEM_SUM LOAD:$SYS_LOAD"
  74. #   echo -e "$NAME: $SYS_MON\n"
  75.  
  76.     SYS_LOAD_TOO_HIGH=`awk 'BEGIN{print('$SYS_LOAD'>'$SYS_LOAD_MAX')}'`
  77.     PID_MEM_SUM_TOO_HIGH=`awk 'BEGIN{print('$PID_MEM_SUM'>'$PID_MEM_SUM_MAX')}'`
  78.  
  79.     if [[ "$SYS_LOAD_TOO_HIGH" = "1" || "$PID_MEM_SUM_TOO_HIGH" = "1" ]];then
  80.         /etc/init.d/$NAME stop
  81.         sleep 5
  82.         for ((i=1;i<4;i++))
  83.         do
  84.             if [ `pgrep $NAME | wc -l` = "0" ];then
  85.                 echo "$DATA_TIME: Stop $NAME successful! ($SYS_MON)" | tee -a $LOG_PATH
  86.                 break
  87.             else
  88.                 echo "${DATA_TIME}: [WARNING!] Stop $NAME failed[$i]! ($SYS_MON)" | tee -a $LOG_PATH
  89.                 pkill $NAME && killall $NAME
  90.             fi
  91.         done
  92.         /etc/init.d/$NAME start
  93.         sleep 5
  94.         for ((ii=1;ii<4;ii++))
  95.         do
  96.             if [ `pgrep $NAME | wc -l` != "0" ];then
  97.                 echo "$DATA_TIME: Start $NAME successful!" | tee -a $LOG_PATH
  98.                 break
  99.             else
  100.                 echo "${DATA_TIME}: [WARNING!] Start $NAME failed[$ii]! ($SYS_MON)" | tee -a $LOG_PATH
  101.                 /etc/init.d/$NAME start
  102.                 sleep 5
  103.             fi
  104.         done
  105.         if [ `pgrep $NAME | wc -l` != "0" ];then
  106.             echo "${DATA_TIME}: [ERROR!] Start $NAME failed! ($SYS_MON)" | mail -s "Start $NAME failed" $EMAIL
  107.         fi
  108.     fi
  109. done
  110.  
  111. STATUS_CODE=`curl -o /dev/null -s -w %{http_code} $MY_URL`
  112. #echo -e "STATUS CODE: $STATUS_CODE\n"
  113.  
  114. if [ "$STATUS_CODE" != "200" ];then
  115.     sleep 3
  116.     STATUS_CODE=`curl -o /dev/null -s -w %{http_code} $MY_URL`
  117.     if [ "$STATUS_CODE" != "200" ];then
  118.         echo "${DATA_TIME}: [WARNING!] Website Downtime! ($SYS_MON)" | tee -a $LOG_PATH
  119.         echo "${DATA_TIME}: [WARNING!] Website Downtime! ($SYS_MON)" | mail -s "Start $NAME failed" $EMAIL
  120.     fi
  121. fi
Advertisement
Add Comment
Please, Sign In to add comment