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