溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)一個(gè)能監(jiān)控系統(tǒng)資源的shell腳本

發(fā)布時(shí)間:2021-11-08 10:24:06 來源:億速云 閱讀:102 作者:小新 欄目:云計(jì)算

這篇文章主要為大家展示了“如何實(shí)現(xiàn)一個(gè)能監(jiān)控系統(tǒng)資源的shell腳本”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何實(shí)現(xiàn)一個(gè)能監(jiān)控系統(tǒng)資源的shell腳本”這篇文章吧。


 

[root@AR log]# cat monitor

#!/bin/bash
#System Monitoring Script
while [ 1 ]
do
#本機(jī)需開啟postfix或sendmail服務(wù)。
#報(bào)警郵件地址設(shè)置
MAILFROM=monitor@zhaoyun.com
MAILTO=zhaoyun006@163.com
#設(shè)置腳本運(yùn)行間隔時(shí)間。單位(秒)。
RUNTIME=1
#內(nèi)存使用率監(jiān)控設(shè)置,單位 (%)
MEMTHRE=90
#流量監(jiān)控設(shè)置
#要監(jiān)控的網(wǎng)卡
ETHX=eth0
#填寫大于多少M(fèi)B的時(shí)候發(fā)送警報(bào),單位(MB)
INFLOWTHREMB=50
OUTFLOWTHREMB=50
#填寫大于多少KB的時(shí)候發(fā)送警報(bào),單位(KB)
INFLOWTHREKB=500
OUTFLOWTHREKB=500
#TCP連接狀態(tài)數(shù)量監(jiān)控設(shè)置
#填寫最大連接的個(gè)數(shù)
TIME_WAIT=10
FIN_WAIT1=20
FIN_WAIT2=20
ESTABLISHED=20
SYN_RECV=10
CLOSE_WAIT=10
CLOSING=10
LAST_ACK=10
#CPU使用率監(jiān)控設(shè)置
#填寫cpu使用率大于多少發(fā)送報(bào)警,單位(%)
CPUTHRE=5
#硬盤使用大小設(shè)置
#填寫硬盤占用率,單位(%)
ROOT=80
VAR=100
USR=100
BOOT=80
#調(diào)試模式開關(guān)。(YES/NO)
DBUG=NO

#                 監(jiān) 控 腳 本 執(zhí) 行 內(nèi) 容     
################################################################################
time=`date +"%Y-%m-%d %H:%M:%S"`
#內(nèi)存監(jiān)控部分
NULL=/dev/null
MEM=`free -m |grep Mem |awk '{print $3/$2*100}'`
MEMB=`free -m |grep Mem |awk '{print $2,$4+$6+$7}'|awk '{print $1,$1-$2}'| awk '{print $2/$1*100}'`
#echo $MEM
#echo $MEMB
MA=`expr $MEM \> $MEMTHRE `
if [ $MA -eq 1 ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
 
$time MEM內(nèi)存警告,當(dāng)前內(nèi)存占用率為$MEM %,大于$MEMTHRE %.
EOF
    fi

MB=`expr $MEMB \> $MEMTHRE`
if [ $MB -eq 1 ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
 
$time MEMB內(nèi)存警告,當(dāng)前內(nèi)存占用率為$MEMB %,大于$MEMTHRE %
EOF
    fi


#流量監(jiān)控部分
FLOWA=/tmp/.flow
ifconfig $ETHX |grep "RX byte" |awk '{print $2"    "$6}' |awk -Fbytes: '{print "INPUT  "$2"OUTPUT  "$3}'\ > $FLOWA
INPUTA=`cat $FLOWA |awk '{print $2}'`
OUTPUTA=`cat $FLOWA |awk '{print $4}'`
sleep 1
ifconfig $ETHX |grep "RX byte" |awk '{print $2"    "$6}' |awk -Fbytes: '{print "INPUT  "$2"OUTPUT  "$3}'\ > $FLOWA
INPUTB=`cat $FLOWA |awk '{print $2}'`
OUTPUTB=`cat $FLOWA |awk '{print $4}'`
INPUTC=`echo "$INPUTB-$INPUTA" | bc`
OUTPUTC=`echo "$OUTPUTB-$OUTPUTA"| bc`
INPUTMBA=`echo "$INPUTC/1024"|bc`
OUTPUTMBA=`echo "$OUTPUTC/1024"|bc`
INMBF=/tmp/.inputMB
OUTMBF=/tmp/.outputMB
echo `echo "scale=4;$INPUTMBA/1024"|bc`MB > $INMBF
echo `echo "scale=4;$OUTPUTMBA/1024"|bc`MB > $OUTMBF
INMB=`cat $INMBF |awk '{print $1}'`
OUTMB=`cat $OUTMBF |awk '{print $1}'`
  if [ $INPUTMBA -gt 1024 ] ; then
              if [ $INMB -gt $INFLOWTHREMB ] ;then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 流量警告,當(dāng)前流量異常,請登錄服務(wù)器查看。當(dāng)前速率$INMB MB/秒,大于$INFLOWTHREMB MB/秒。
EOF
              fi
    if [ $OUTMB -gt $OUTFLOWTHREMB ] ;then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 流量警告,當(dāng)前流量異常,請登錄服務(wù)器查看。當(dāng)前速率$OUTMB MB/秒 大于$OUTFLOWTHREMB MB/秒。
EOF
    fi
else
INKBF=/tmp/.inputKB
OUTKBF=/tmp/.outputKB
echo $INPUTMBA KB > $INKBF
echo $OUTPUTMBA KB > $OUTKBF
INKB=`cat $INKBF |awk '{print $1}'`
OUTKB=`cat $OUTKBF |awk '{print $1}'`
              if [ $INKB -gt $INFLOWTHREKB ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 流量警告,當(dāng)前流量異常,請登錄服務(wù)器查看。$INKB KB/秒 大于$INFLOWTHREKB KB/秒。
EOF
              fi
    if [ $OUTKB -gt $OUTFLOWTHREKB ] ;then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 流量警告,當(dāng)前流量異常,請登錄服務(wù)器查看。當(dāng)前速率$OUTKB KB/秒大于$INFLOWTHREKB KB/秒。
EOF
    fi
fi

#連接數(shù)
tcpfile=/tmp/.tcp
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' >$tcpfile
grep TIME_WAIT $tcpfile > $NULL
if [ $? -eq 1 ] ; then
echo "TIME_WAIT 0 " >> $tcpfile
fi
grep FIN_WAIT1 $tcpfile > $NULL
if [ $? -eq 1 ] ; then
echo "FIN_WAIT1 0 " >> $tcpfile
fi
grep FIN_WAIT2 $tcpfile  > $NULL
if [ $? -eq 1 ] ; then
echo "FIN_WAIT2 0 " >> $tcpfile
fi
grep CLOSE_WAIT $tcpfile  > $NULL
if [ $? -eq 1 ] ; then
echo "CLOSE_WAIT 0 " >> $tcpfile
fi
grep LAST_ACK $tcpfile  > $NULL
if [ $? -eq 1 ] ; then
echo "LAST_ACK 0 " >> $tcpfile
fi
grep SYN_RECV $tcpfile  > $NULL
if [ $? -eq 1 ] ; then
echo "SYN_RECV 0 " >> $tcpfile
fi
grep CLOSING $tcpfile  > $NULL
if [ $? -eq 1 ] ; then
echo "CLOSING 0 " >> $tcpfile
fi
grep ESTABLISHED $tcpfile  > $NULL
if [ $? -eq 1 ] ; then
echo "ESTABLISHED 0 " >> $tcpfile
fi

 

TIME_WAITV=`grep TIME_WAIT $tcpfile | awk '{print $2}'`
FIN_WAIT1V=`grep FIN_WAIT1 $tcpfile | awk '{print $2}'`
FIN_WAIT2V=`grep FIN_WAIT2 $tcpfile | awk '{print $2}'`
ESTABLISHEDV=`grep ESTABLISHED $tcpfile | awk '{print $2}'`
SYN_RECVV=`grep SYN_RECV $tcpfile | awk '{print $2}'`
CLOSINGV=`grep CLOSING $tcpfile | awk '{print $2}'`
CLOSE_WAITV=`grep CLOSE_WAIT $tcpfile | awk '{print $2}'`
LAST_ACKV=`grep LAST_ACK $tcpfile | awk '{print $2}'`
  if [ $ESTABLISHEDV -gt $ESTABLISHED ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 連接數(shù)警告,當(dāng)前ESTABLISHED連接數(shù)異常,請登錄服務(wù)器查看。當(dāng)前連接數(shù)為$ESTABLISHEDV個(gè),大于$ESTABLISHED個(gè)
EOF
  fi
  if [ $SYN_RECVV -gt $SYN_RECV ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 連接數(shù)警告,當(dāng)前SYN_RECV連接數(shù)異常,請登錄服務(wù)器查看。當(dāng)前連接數(shù)為$SYN_RECVV個(gè),大于$SYN_REC個(gè)。
EOF
  fi
 if [ $CLOSE_WAITV -gt $CLOSE_WAIT ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 連接數(shù)警告,當(dāng)前CLOSE_WAIT連接數(shù)異常,請登錄服務(wù)器查看。當(dāng)前連接數(shù)為$CLOSE_WAITV個(gè),大于$CLOSE_WAIT個(gè)。
EOF
  fi
  if [ $CLOSINGV -gt $CLOSING ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 連接數(shù)警告,當(dāng)前CLOSING連接數(shù)異常,請登錄服務(wù)器查看。當(dāng)前連接數(shù)為$CLOSINGV個(gè),大于$CLOSING個(gè)。
EOF
  fi
  if [ $LAST_ACKV -gt $LAST_ACK ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 連接數(shù)警告,當(dāng)前LAST_ACK連接數(shù)異常,請登錄服務(wù)器查看。當(dāng)前連接數(shù)為$LAST_ACKV個(gè),大于$LAST_ACK個(gè)。    
EOF
  fi
if [ $TIME_WAITV -gt $TIME_WAIT ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 連接數(shù)警告,當(dāng)前TIME_WAIT連接數(shù)異常,請登錄服務(wù)器查看。當(dāng)前連接數(shù)為$TIME_WAITV個(gè),大于$TIME_WAIT個(gè)。    
EOF
  fi
if [ $FIN_WAIT1V -gt $FIN_WAIT1 ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 連接數(shù)警告,當(dāng)前FIN_WAIT1連接數(shù)異常,請登錄服務(wù)器查看。當(dāng)前連接數(shù)為$FIN_WAIT1V個(gè),大于$FIN_WAIT1個(gè)。  
EOF
  fi
if [ $FIN_WAIT2V -gt $FIN_WAIT2 ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 連接數(shù)警告,當(dāng)前FIN_WAIT2連接數(shù)異常,請登錄服務(wù)器查看。當(dāng)前連接數(shù)為$FIN_WAIT2V個(gè),大于$FIN_WAIT2個(gè)。
EOF
  fi
DISKF=/tmp/.disk
df -h > $DISKF
grep var $DISKF > $NULL
if [ $? -eq 1 ] ; then
echo "/dev/sda1 20G  1.6G   17G   0% /var" >> $DISKF
fi
grep usr $DISKF > $NULL
if [ $? -eq 1 ] ; then
echo "/dev/sda1 20G  1.6G   17G   0% /usr" >> $DISKF
fi
grep boot $DISKF > $NULL
if [ $? -eq 1 ] ; then
echo "/dev/sda1 20G  1.6G   17G   0% /boot" >> $DISKF
fi
BOOTV=`cat $DISKF | grep boot  | awk '{print $5}'|awk -F% '{print $1}'`
VARV=`cat  $DISKF  | grep var  | awk '{print $5}'|awk -F% '{print $1}'`
USRV=`cat  $DISKF  | grep usr  | awk '{print $5}'|awk -F% '{print $1}'`
grep VolGroup $DISKF > $NULL
if [ $? -eq 0 ] ;then
ROOTV=`cat $DISKF | sed -n '3p' |awk '{print $4}'|awk -F% '{print $1}'`
else
ROOTV=`cat $DISKF | sed -n '2p'|awk '{print $5}'|awk -F% '{print $1}'`
fi
if [ $ROOTV -gt $ROOT ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 磁盤使用警告,您監(jiān)控的 /  分區(qū)已經(jīng)大于你設(shè)置的數(shù)值$ROOT %,詳情登陸系統(tǒng)查看,目前使用率為$ROOTV %.
EOF
fi
if [ $VARV -gt $VAR ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 磁盤使用警告,您監(jiān)控的 /var 分區(qū)已經(jīng)大于你設(shè)置的數(shù)值$VAR %,詳情登陸系統(tǒng)查看,目前使用率為$VARV %.
EOF
fi
if [ $BOOTV -gt $BOOT ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 磁盤使用警告,您監(jiān)控的 /boot  分區(qū)已經(jīng)大于你設(shè)置的數(shù)值 $BOOT %,詳情登陸系統(tǒng)查看,目前使用率為$BOOTV %.
EOF
fi
if [ $USRV -gt $USR ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 磁盤使用警告,您監(jiān)控的 /usr  分區(qū)已經(jīng)大于你設(shè)置的數(shù)值$USR %,詳情登陸系統(tǒng)查看,目前使用率為$USRV %.
EOF
fi
#CPU
TotalA=`cat /proc/stat | sed -n '1p' | awk '{print $2+$3+$4+$5+$6+$7+$8}'`
IDLEA=`cat /proc/stat |sed -n '1p' |awk '{print $5}'`
sleep 2
TotalB=`cat /proc/stat | sed -n '1p' | awk '{print $2+$3+$4+$5+$6+$7+$8}'`
IDLEB=`cat /proc/stat |sed -n '1p' |awk '{print $5}'`
Total=`echo "$TotalB-$TotalA" |bc`
Idle=`echo "$IDLEB-$IDLEA" |bc`
USAGE=`echo "$Idle/$Total*100"|bc -l`
RATE=`echo "100-$USAGE "|bc -l`
USERATE=`echo "scale=2;$RATE/1"|bc`%
CA=`expr $USERATE \> $CPUTHRE`
if [ $CA -eq 1 ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time CPU使用警告,您監(jiān)控的CPU使用率,已經(jīng)超過您設(shè)置的限額$CPUTHRE % ,當(dāng)前CPU使用率為$USERATE .
EOF
fi
CPURATE=`top -b -n 1 |grep Cpu | awk '{print $5}' |awk -F%id '{print 100-$1}'`
CB=`expr $CPURATE \> $CPUTHRE`
if [ $CB -eq 1  ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time CPU使用警告,您監(jiān)控的CPU使用率,已經(jīng)超過您設(shè)置的限額$CPUTHRE %,當(dāng)前CPU使用率為$CPURATE .
EOF
fi
DBUGS=YES
if [ "$DBUGS" == "$DBUG" ] ; then
echo "           "'& 內(nèi)  存 &' ;echo \ ;
echo "  "當(dāng)前程序占用內(nèi)存為 $MEMB % ,總占用內(nèi)存為 $MEM % ; echo \ ;
echo "           "'& 流  量 &'; echo \ ;
YA=`wc -l $INMBF > /dev/null 2>&1 ; echo $?`
    if [ $YA -eq 1 ] ; then
echo 0 > $INMBF
    fi
IN=`expr $INMB \> $INFLOWTHREMB >$NULL; echo $? ` 2> $NULL
         if [ $IN -eq 1 ] ; then
echo "    "當(dāng)前輸入流量為 $INMB MB/秒 .;
echo "    "當(dāng)前輸入流量為 $INKB KB/秒 .;
          fi
YB=`wc -l $OUTMBF > /dev/null 2>&1 ; echo $?`
       if [ $YB -eq 1 ] ; then
echo 0 > $OUTMBF
        fi
OUT=`expr $OUTMB \> $OUTFLOWTHREMB >$NULL ; echo $?` 2> $NULL
    if [ $OUT -eq 1 ] ; then
echo "    "當(dāng)前輸出流量為 $OUTMB MB/秒。 ; 
echo "    "當(dāng)前輸出流量為 $OUTKB KB/秒。 ; echo \ ;
    fi
echo "           "'& 連接數(shù) &' ; echo \ ;
echo "    "當(dāng)前TIME_WAIT"  " 連接數(shù)為 $TIME_WAITV 個(gè)。
echo "    "當(dāng)前FIN_WAIT1"  " 連接數(shù)為 $FIN_WAIT1V 個(gè)。
echo "    "當(dāng)前FIN_WAIT2"  " 連接數(shù)為 $FIN_WAIT2V 個(gè)。
echo "    "當(dāng)前CLOSE_WAIT" " 連接數(shù)為 $CLOSE_WAITV 個(gè)。
echo "    "當(dāng)前ESTABLISHED"" 連接數(shù)為 $ESTABLISHEDV 個(gè)。
echo "    "當(dāng)前SYN_RECV"   " 連接數(shù)為 $SYN_RECVV 個(gè)。
echo "    "當(dāng)前LAST_ACKV"  " 連接數(shù)為 $LAST_ACKV 個(gè)。
echo "    "當(dāng)前CLOSING"    " 連接數(shù)為 $CLOSINGV 個(gè)。; echo \ ;
echo "         "'& CPU使用率 &' ; echo \ ;
echo "    "當(dāng)前CPU 進(jìn)程使用率為 $USERATE  . ;echo \ ;
echo "         "'& 磁盤使用率 &' ; echo \ ;
echo "    "當(dāng)前"  "/"  "分區(qū),"  "使用率為 $ROOTV %.
echo "    "當(dāng)前/var 分區(qū), 使用率為 $VARV %.
echo "    "當(dāng)前/boot分區(qū), 使用率為 $BOOTV %.
echo "    "當(dāng)前/usr 分區(qū), 使用率為 $USRV %.
exit
fi
sleep $RUNTIME
done
 

運(yùn)行方法,在后臺運(yùn)行。

[root@AR log]# ./monitor &

停止方法

[root@AR log]# ps -aux |grep monitor | grep -v grep | awk '{print $2}' | xargs kill -9

郵件效果截圖

如何實(shí)現(xiàn)一個(gè)能監(jiān)控系統(tǒng)資源的shell腳本

如何實(shí)現(xiàn)一個(gè)能監(jiān)控系統(tǒng)資源的shell腳本

如何實(shí)現(xiàn)一個(gè)能監(jiān)控系統(tǒng)資源的shell腳本  
 
 如何實(shí)現(xiàn)一個(gè)能監(jiān)控系統(tǒng)資源的shell腳本  
 

打開DBUG后效果截圖,設(shè)置DBUG=YES時(shí)生效。

如何實(shí)現(xiàn)一個(gè)能監(jiān)控系統(tǒng)資源的shell腳本

以上是“如何實(shí)現(xiàn)一個(gè)能監(jiān)控系統(tǒng)資源的shell腳本”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI