千家信息网

如何实现一个能监控系统资源的shell脚本

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要为大家展示了"如何实现一个能监控系统资源的shell脚本",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何实现一个能监控系统资源的shell脚
千家信息网最后更新 2026年11月02日如何实现一个能监控系统资源的shell脚本

这篇文章主要为大家展示了"如何实现一个能监控系统资源的shell脚本",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何实现一个能监控系统资源的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 <from: $MAILFROM
to:$MAILTO
subject: warning

$time MEM内存警告,当前内存占用率为$MEM %,大于$MEMTHRE %.
EOF
fi

MB=`expr $MEMB \> $MEMTHRE`
if [ $MB -eq 1 ] ; then
sendmail -t <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 <from: $MAILFROM
to:$MAILTO
subject: warning
$time 流量警告,当前流量异常,请登录服务器查看。当前速率$INMB MB/秒,大于$INFLOWTHREMB MB/秒。
EOF
fi
if [ $OUTMB -gt $OUTFLOWTHREMB ] ;then
sendmail -t <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 <from: $MAILFROM
to:$MAILTO
subject: warning
$time 流量警告,当前流量异常,请登录服务器查看。$INKB KB/秒 大于$INFLOWTHREKB KB/秒。
EOF
fi
if [ $OUTKB -gt $OUTFLOWTHREKB ] ;then
sendmail -t <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 <from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前ESTABLISHED连接数异常,请登录服务器查看。当前连接数为$ESTABLISHEDV个,大于$ESTABLISHED个
EOF
fi
if [ $SYN_RECVV -gt $SYN_RECV ] ; then
sendmail -t <from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前SYN_RECV连接数异常,请登录服务器查看。当前连接数为$SYN_RECVV个,大于$SYN_REC个。
EOF
fi
if [ $CLOSE_WAITV -gt $CLOSE_WAIT ] ; then
sendmail -t <from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前CLOSE_WAIT连接数异常,请登录服务器查看。当前连接数为$CLOSE_WAITV个,大于$CLOSE_WAIT个。
EOF
fi
if [ $CLOSINGV -gt $CLOSING ] ; then
sendmail -t <from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前CLOSING连接数异常,请登录服务器查看。当前连接数为$CLOSINGV个,大于$CLOSING个。
EOF
fi
if [ $LAST_ACKV -gt $LAST_ACK ] ; then
sendmail -t <from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前LAST_ACK连接数异常,请登录服务器查看。当前连接数为$LAST_ACKV个,大于$LAST_ACK个。
EOF
fi
if [ $TIME_WAITV -gt $TIME_WAIT ] ; then
sendmail -t <from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前TIME_WAIT连接数异常,请登录服务器查看。当前连接数为$TIME_WAITV个,大于$TIME_WAIT个。
EOF
fi
if [ $FIN_WAIT1V -gt $FIN_WAIT1 ] ; then
sendmail -t <from: $MAILFROM
to:$MAILTO
subject: warning
$time 连接数警告,当前FIN_WAIT1连接数异常,请登录服务器查看。当前连接数为$FIN_WAIT1V个,大于$FIN_WAIT1个。
EOF
fi
if [ $FIN_WAIT2V -gt $FIN_WAIT2 ] ; then
sendmail -t <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 <from: $MAILFROM
to:$MAILTO
subject: warning
$time 磁盘使用警告,您监控的 / 分区已经大于你设置的数值$ROOT %,详情登陆系统查看,目前使用率为$ROOTV %.
EOF
fi
if [ $VARV -gt $VAR ] ; then
sendmail -t <from: $MAILFROM
to:$MAILTO
subject: warning
$time 磁盘使用警告,您监控的 /var 分区已经大于你设置的数值$VAR %,详情登陆系统查看,目前使用率为$VARV %.
EOF
fi
if [ $BOOTV -gt $BOOT ] ; then
sendmail -t <from: $MAILFROM
to:$MAILTO
subject: warning
$time 磁盘使用警告,您监控的 /boot 分区已经大于你设置的数值 $BOOT %,详情登陆系统查看,目前使用率为$BOOTV %.
EOF
fi
if [ $USRV -gt $USR ] ; then
sendmail -t <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 <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 <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时生效。

以上是"如何实现一个能监控系统资源的shell脚本"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

使用率 监控 流量 服务 服务器 登录 内存 系统 单位 磁盘 脚本 数值 详情 登陆 监控系统 资源 内容 用率 篇文章 速率 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 什么是科技互联网 广东万易互联网科技有限公司惠州分公司 广州大一互联网络科技有限公司 中国互联网科技股 互联网和科技创新 互联网为科技 喔噻互联网科技 猪兼强互联网科技 万易互联网科技有限公司 郑州华宇互联网科技 互联网科技素材视频竖屏 深圳卡尔迅互联网科技有限公司怎么样 农村开互联网科技讲堂 央行互联网金融科技公司 银川新华互联网科技学校联系电话 群盈汇互联网科技有限公司 黑科技 体验场景 互联网大会 上海同邻互联网科技有限公司规模 互联网科技自媒体灵感 中智农互联网科技 互联网和科技创新 新浪科技互联网 融贸通互联网科技 郑州华宇互联网科技 福州新华互联网科技学校 知乎 汽车互联网创新科技园 滨湖区互联网智能科技产品有哪些 上海钢联属于互联网科技股吗 宁波允成互联网科技有限公司
0