View difference between Paste ID: CRUPABMx and vLPRNcF6
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