一个能监控系统资源的shell脚本

简介:
 
刚写了个监控系统资源的脚本,就是一个抛砖引玉的效果。大家可以研究下。
前边的数值可以改下,改成自己想监控的大小,
监控脚本执行内容之前的变量是设置监控信息的,按需求修改。
[root@AR log]# cat monitor
#!/bin/bash
#System Monitoring Script
while [ 1 ]
do
#本机需开启postfix或sendmail服务。
#报警邮件地址设置
MAILFROM=monitor@zhaoyun.com
MAILTO=zhaoyun006@163.com
#设置脚本运行间隔时间。单位(秒)。
RUNTIME=1
#内存使用率监控设置,单位 (%)
MEMTHRE=90
#流量监控设置
#要监控的网卡
ETHX=eth0
#填写大于多少MB的时候发送警报,单位(MB)
INFLOWTHREMB=50
OUTFLOWTHREMB=50
#填写大于多少KB的时候发送警报,单位(KB)
INFLOWTHREKB=500
OUTFLOWTHREKB=500
#TCP连接状态数量监控设置
#填写最大连接的个数
TIME_WAIT=10
FIN_WAIT1=20
FIN_WAIT2=20
ESTABLISHED=20
SYN_RECV=10
CLOSE_WAIT=10
CLOSING=10
LAST_ACK=10
#CPU使用率监控设置
#填写cpu使用率大于多少发送报警,单位(%)
CPUTHRE=5
#硬盘使用大小设置
#填写硬盘占用率,单位(%)
ROOT=80
VAR=100
USR=100
BOOT=80
#调试模式开关。(YES/NO)
DBUG=NO
#                 监 控 脚 本 执 行 内 容      
################################################################################
time=`date +"%Y-%m-%d %H:%M:%S"`
#内存监控部分
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内存警告,当前内存占用率为$MEM %,大于$MEMTHRE %.
EOF
    fi
MB=`expr $MEMB \> $MEMTHRE`
if [ $MB -eq 1 ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
 
$time MEMB内存警告,当前内存占用率为$MEMB %,大于$MEMTHRE %
EOF
    fi

#流量监控部分
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 流量警告,当前流量异常,请登录服务器查看。当前速率$INMB MB/秒,大于$INFLOWTHREMB MB/秒。
EOF
              fi
    if [ $OUTMB -gt $OUTFLOWTHREMB ] ;then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 流量警告,当前流量异常,请登录服务器查看。当前速率$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 流量警告,当前流量异常,请登录服务器查看。$INKB KB/秒 大于$INFLOWTHREKB KB/秒。
EOF
              fi
    if [ $OUTKB -gt $OUTFLOWTHREKB ] ;then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 流量警告,当前流量异常,请登录服务器查看。当前速率$OUTKB KB/秒大于$INFLOWTHREKB KB/秒。
EOF
    fi
fi
#连接数
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 连接数警告,当前ESTABLISHED连接数异常,请登录服务器查看。当前连接数为$ESTABLISHEDV个,大于$ESTABLISHED个
EOF
  fi
  if [ $SYN_RECVV -gt $SYN_RECV ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前SYN_RECV连接数异常,请登录服务器查看。当前连接数为$SYN_RECVV个,大于$SYN_REC个。
EOF
  fi
 if [ $CLOSE_WAITV -gt $CLOSE_WAIT ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前CLOSE_WAIT连接数异常,请登录服务器查看。当前连接数为$CLOSE_WAITV个,大于$CLOSE_WAIT个。
EOF
  fi
  if [ $CLOSINGV -gt $CLOSING ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前CLOSING连接数异常,请登录服务器查看。当前连接数为$CLOSINGV个,大于$CLOSING个。
EOF
  fi
  if [ $LAST_ACKV -gt $LAST_ACK ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前LAST_ACK连接数异常,请登录服务器查看。当前连接数为$LAST_ACKV个,大于$LAST_ACK个。     
EOF
  fi
if [ $TIME_WAITV -gt $TIME_WAIT ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前TIME_WAIT连接数异常,请登录服务器查看。当前连接数为$TIME_WAITV个,大于$TIME_WAIT个。     
EOF
  fi
if [ $FIN_WAIT1V -gt $FIN_WAIT1 ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前FIN_WAIT1连接数异常,请登录服务器查看。当前连接数为$FIN_WAIT1V个,大于$FIN_WAIT1个。   
EOF
  fi
if [ $FIN_WAIT2V -gt $FIN_WAIT2 ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前FIN_WAIT2连接数异常,请登录服务器查看。当前连接数为$FIN_WAIT2V个,大于$FIN_WAIT2个。
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 磁盘使用警告,您监控的 /  分区已经大于你设置的数值$ROOT %,详情登陆系统查看,目前使用率为$ROOTV %.
EOF
fi
if [ $VARV -gt $VAR ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 磁盘使用警告,您监控的 /var 分区已经大于你设置的数值$VAR %,详情登陆系统查看,目前使用率为$VARV %.
EOF
fi
if [ $BOOTV -gt $BOOT ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 磁盘使用警告,您监控的 /boot  分区已经大于你设置的数值 $BOOT %,详情登陆系统查看,目前使用率为$BOOTV %.
EOF
fi
if [ $USRV -gt $USR ] ; then
sendmail -t <<EOF
from: $MAILFROM
to:$MAILTO
subject: warning
$time 磁盘使用警告,您监控的 /usr  分区已经大于你设置的数值$USR %,详情登陆系统查看,目前使用率为$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使用警告,您监控的CPU使用率,已经超过您设置的限额$CPUTHRE % ,当前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使用警告,您监控的CPU使用率,已经超过您设置的限额$CPUTHRE %,当前CPU使用率为$CPURATE .
EOF
fi
DBUGS=YES
if [ "$DBUGS" == "$DBUG" ] ; then
echo "           "'& 内  存 &' ;echo \ ;
echo "  "当前程序占用内存为 $MEMB % ,总占用内存为 $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 "    "当前输入流量为 $INMB MB/秒 .; 
echo "    "当前输入流量为 $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 "    "当前输出流量为 $OUTMB MB/秒。 ;  
echo "    "当前输出流量为 $OUTKB KB/秒。 ; echo \ ;
    fi
echo "           "'& 连接数 &' ; echo \ ;
echo "    "当前TIME_WAIT"  " 连接数为 $TIME_WAITV 个。
echo "    "当前FIN_WAIT1"  " 连接数为 $FIN_WAIT1V 个。
echo "    "当前FIN_WAIT2"  " 连接数为 $FIN_WAIT2V 个。
echo "    "当前CLOSE_WAIT" " 连接数为 $CLOSE_WAITV 个。
echo "    "当前ESTABLISHED"" 连接数为 $ESTABLISHEDV 个。
echo "    "当前SYN_RECV"   " 连接数为 $SYN_RECVV 个。
echo "    "当前LAST_ACKV"  " 连接数为 $LAST_ACKV 个。
echo "    "当前CLOSING"    " 连接数为 $CLOSINGV 个。; echo \ ;
echo "         "'& CPU使用率 &' ; echo \ ;
echo "    "当前CPU 进程使用率为 $USERATE  . ;echo \ ;
echo "         "'& 磁盘使用率 &' ; echo \ ;
echo "    "当前"  "/"  "分区,"  "使用率为 $ROOTV %.
echo "    "当前/var 分区, 使用率为 $VARV %.
echo "    "当前/boot分区, 使用率为 $BOOTV %.
echo "    "当前/usr 分区, 使用率为 $USRV %.
exit 
fi
sleep $RUNTIME
done
 
运行方法,在后台运行。
[root@AR log]# ./monitor &
 
停止方法
[root@AR log]# ps -aux |grep monitor | grep -v grep | awk '{print $2}' | xargs kill -9
邮件效果截图
 
 
 



打开DBUG后效果截图,设置DBUG=YES时生效。
 
 
本文转自zhaoyun00 51CTO博客,原文链接:http://blog.51cto.com/zhaoyun/626083


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
466 9
|
3月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
395 3
|
6月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
294 60
|
3月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
5月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
711 1
|
7月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
217 17
|
7月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
463 3
|
Shell 索引
shell脚本入门到实战(四)- 数组
shell脚本入门到实战(四)- 数组
154 0
|
Shell
shell脚本入门到实战(三) - 变量
shell脚本入门到实战(三) - 变量
179 0
|
Shell Linux 人机交互
shell脚本入门到实战(二)--shell输入和格式化输出
shell脚本入门到实战(二)--shell输入和格式化输出
704 0