shell:实现linux服务器资源监控并发送告警邮件
1、安装方式
wget http://10.8.225.126/wsmonitor/install.sh;sh install.sh test@test.com
2、install.sh
#!/bin/sh
if [ $# -ne ]; then
echo "########################################################"
echo "# 用法:sh install_monitor.sh 邮箱地址; #"
echo "# 如:sh install_monitor.sh chenjy@wangsu.com #"
echo "# 若邮箱地址多个用英文逗号分隔 #"
echo "########################################################"
exit
fi
#对应目录放开权限,安装sendmail
/usr/bin/chattr -i /etc/shadow /etc/passwd /etc/gshadow /etc/group /etc/group-
mkdir /var/spool/clientmqueue;chmod /var/spool/clientmqueue for i in `seq `
do
echo $i
rpm -q --quiet sendmail
if [ $? == ]; then
yum install -y sendmail
if [ $? == ]; then
echo "######ERROR!sendmail install fail!######"
echo "######Please try [yum install -y sendmail]######"
exit
fi
fi
rpm -q --quiet sendmail
if [ $? == ]; then
service sendmail restart
if [ $? == ]; then
echo "######ERROR!sendmail start fail!######"
echo "######Please try [service sendmail restart]######"
exit
fi
chkconfig --add sendmail
break
fi
done
#下载监控脚本及启动后台执行
current=`date "+%Y-%m-%d %H:%M:%S"`
timestamp=`date -d "$current" +%s`
mkdir -p /usr/local/wsmonitor
mkdir -p /usr/local/wsmonitor/bak
for i in `seq `
do
echo $i
# if [ -f wsmonitor.sh ];then
# mv /usr/local/wsmonitor/wsmonitor.sh /usr/local/wsmonitor/bak/wsmonitor.sh.$timestamp
# fi wget http://10.8.225.126/wsmonitor/wsmonitor.sh -O /usr/local/wsmonitor/wsmonitor.sh
wget http://10.8.225.126/wsmonitor/wsmonitor -O /etc/init.d/wsmonitor
wget http://10.8.225.126/wsmonitor/ReadMe_wsmonitor.txt -O /usr/local/wsmonitor/ReadMe_wsmonitor.txt
#替换监控脚本中的邮箱地址
sed -i 's/MAILTO=chenjy@wangsu.com/MAILTO='$'/g' /usr/local/wsmonitor/wsmonitor.sh
#启动服务
chmod +x /etc/init.d/wsmonitor
service wsmonitor restart
echo "#################################################################"
echo "#####Install wsmonitor success! #####"
echo "#################################################################"
echo "#####If you want to change mailaddress,edit [/usr/local/wsmonitor/wsmonitor.sh]! #####"
echo "#####Please use [service wsmonitor start/stop/restart] #####"
echo "使用说明见:/usr/local/wsmonitor/ReadMe_wsmonitor.txt"
exit
done
3、wsmontor.sh
#!/bin/bash
ntpdate cn.pool.ntp.org
#配置多个收件人用英文逗号隔开
#MAILTO=cc@wangsu.com,qinjy@wangsu.com
#MAILTO=cc@wangsu.com
MAILTO=chenjy@wangsu.com,yuzt@wangsu.com
#、监控间隔时间,单位(秒)
TIME_INTERVAL=
#、内存使用率,单位 (%)
MEM_RATE=
#、流量监控设置
#要监控的网卡
ETH_NAME=eth0
#上行下行流量,单位(MB)
FLOWIN_MB=
FLOWOUT_MB=
#、TCP连接状态数量,连接的最大个数
TIME_WAIT=
ESTABLISHED=
#、CPU使用率,大于该值发送告警,单位(%)
CPU_RATE=
#、硬盘占用率,单位(%)
DISK_RATE= ############################################################
################!以下脚本内容不需要修改!!################
############################################################ #检测是否加入crontab
#username=`users|awk '{print $1}'`
#crontab_path=/var/spool/cron/$username
#script_path=`pwd`
#ifexist=`crontab -l|grep wsmonitor_keepalive.sh|wc -l`
#ifexist_mail=`crontab -l|grep wsmonitor_keepalive.sh|grep $MAILTO|wc -l`
#if [ $ifexist -eq 0 ];then
# echo "1 * * * * sh $script_path/wsmonitor_keepalive.sh $MAILTO > /dev/null 2>&1" >>$crontab_path
#elif [[ $ifexist -eq 1 && $ifexist_mail -eq 0 ]];then
# sed -i '/wsmonitor_keepalive.sh/d' $crontab_path
# echo "1 * * * * sh $script_path/wsmonitor_keepalive.sh $MAILTO > /dev/null 2>&1" >>$crontab_path
#fi while [ ]
do
#获取本机IP
SERVER_IP=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
#定义发送邮件的内容
MAILSUBJECT="WARNING_[$SERVER_IP]"
MAILFROM="wsmonitor_test@wangsu.com"
function do_sendmail()
{
sendmail -t <<EOF
from:wsmonitor <$MAILFROM>
to:$MAILTO
subject:[$]_$MAILSUBJECT
Content-Type: text/html;charset=utf-
<html>
<body>
$time $1当前监控记录值为:$,大于设置的阈值:$,详情登陆系统查看[$SERVER_IP]。当天同一资源超过阈值只告警一次。<br />
备注:请勿回复此邮件!
</body></html>
EOF
} # 监 控 脚 本 执 行 内 容
################################################################################
mkdir -p /usr/local/wsmonitor/log
date=`date +"%Y%m%d"`
time=`date +"%Y-%m-%d %H:%M:%S"`
LOG_PATH=/usr/local/wsmonitor/log/monitor_$date.log
##################################################################
####、为CPU使用率计算先记录日志1#################################
####、为FLOW计算先获取flowin和flowout############################
##################################################################
cpulog_1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
flowin_old=$(cat /proc/net/dev|grep -w $ETH_NAME|sed -e "s/\(.*\)\:\(.*\)/\2/g" |awk '{ print $1 }')
flowout_old=$(cat /proc/net/dev|grep -w $ETH_NAME|sed -e "s/\(.*\)\:\(.*\)/\2/g" |awk '{ print $9 }') #监控周期
sleep $TIME_INTERVAL ##################################################################
###########################内存监控部分###########################
##################################################################
#对于应用程序来说,buffers/caches是未被使用的,对应-/+ buffers/cache那一行
memuse=`free -m|grep "buffers/cache"|awk '{print $3}'`
memtotal=`free -m|grep "Mem"|awk '{print $2}'`
MEM_NOW=`echo "$memuse/$memtotal*100"|bc -l|cut -d. -f1`
MEM_TAG=`echo "$MEM_NOW $MEM_RATE"|awk '{tag=0;if($1>$2){tag=1} print tag}'`
echo "$time MEM $MEM_NOW $MEM_RATE $MEM_TAG">>$LOG_PATH #DISK:df -lh查看磁盘使用率,获取最大值
disk_log=/tmp/disk_tmp.log
df -lh|grep -v Filesystem|awk '{print $5}' > $disk_log
DISK_NOW=`cat $disk_log |awk 'BEGIN{max=0}{if($1+0>max+0) max=$1 fi} END {print max}'|cut -d% -f1`
DISK_TAG=`echo "$DISK_NOW $DISK_RATE"|awk '{tag=0;if($1>$2){tag=1} print tag}'`
echo "$time DISK $DISK_NOW $DISK_RATE $DISK_TAG">>$LOG_PATH
###################################################################
#####连接数:只获取ESTABLISHED和TIME_WAIT状态的tcp连接数############
###################################################################
tcpconn_log=/tmp/tcpconn.log
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' >$tcpconn_log #注意连接数为0的情况
grep ESTABLISHED $tcpconn_log > /dev/null
if [ $? -eq ] ; then
echo "ESTABLISHED 0 " >>$tcpconn_log
fi
ESTABLISHED_NOW=`grep ESTABLISHED $tcpconn_log|awk '{print $2}'`
ESTABLISHED_TAG=`echo "$ESTABLISHED_NOW $ESTABLISHED"|awk '{tag=0;if($1>$2){tag=1} print tag}'`
echo "$time ESTABLISHED $ESTABLISHED_NOW $ESTABLISHED $ESTABLISHED_TAG">>$LOG_PATH grep TIME_WAIT $tcpconn_log > /dev/null
if [ $? -eq ] ; then
echo "TIME_WAIT 0 " >>$tcpconn_log
fi
TIME_WAIT_NOW=`grep TIME_WAIT $tcpconn_log|awk '{print $2}'`
TIME_WAIT_TAG=`echo "$TIME_WAIT_NOW $TIME_WAIT"|awk '{tag=0;if($1>$2){tag=1} print tag}'`
echo "$time TIME_WAIT $TIME_WAIT_NOW $TIME_WAIT $TIME_WAIT_TAG">>$LOG_PATH ##################################################################
######################### 流量 ###################################
##################################################################
flowin=$(cat /proc/net/dev|grep -w $ETH_NAME|sed -e "s/\(.*\)\:\(.*\)/\2/g"|awk '{ print $1 }')
flowout=$(cat /proc/net/dev|grep -w $ETH_NAME|sed -e "s/\(.*\)\:\(.*\)/\2/g"|awk '{ print $9 }')
FLOWIN=$((($flowin-$flowin_old)/$TIME_INTERVAL))
FLOWOUT=$((($flowout-$flowout_old)/$TIME_INTERVAL))
#echo "Recv rate: $((${FLOWIN}/1024)) KB/s Sent rate: $((${FLOWOUT}/1024)) KB/s "
flowin_old=${flowin}
flowout_old=${flowout}
#转换单位为MB
FLOWIN_MB_NOW=$(((${FLOWIN}/)/))
FLOWOUT_MB_NOW=$(((${FLOWOUT}/)/))
FLOWIN_MB_TAG=`echo "$FLOWIN_MB_NOW $FLOWIN_MB"|awk '{tag=0;if($1>$2){tag=1} print tag}'`
FLOWOUT_MB_TAG=`echo "$FLOWOUT_MB_NOW $FLOWOUT_MB"|awk '{tag=0;if($1>$2){tag=1} print tag}'`
echo "$time FLOWIN_MB $FLOWIN_MB_NOW $FLOWIN_MB $FLOWIN_MB_TAG">>$LOG_PATH
echo "$time FLOWOUT_MB $FLOWOUT_MB_NOW $FLOWOUT_MB $FLOWOUT_MB_TAG">>$LOG_PATH
#转换单位为KB
FLOWIN_KB_NOW=$((${FLOWIN}/))
FLOWOUT_KB_NOW=$((${FLOWOUT}/))
FLOWIN_KB_TAG=`echo "$FLOWIN_KB_NOW $((${FLOWIN_MB}*1024))"|awk '{tag=0;if($1>$2){tag=1} print tag}'`
FLOWOUT_KB_TAG=`echo "$FLOWOUT_KB_NOW $((${FLOWOUT_MB}*1024))"|awk '{tag=0;if($1>$2){tag=1} print tag}'`
echo "$time FLOWIN_KB $FLOWIN_KB_NOW $((${FLOWIN_MB}*1024)) $FLOWIN_KB_TAG">>$LOG_PATH
echo "$time FLOWOUT_KB $FLOWOUT_KB_NOW $((${FLOWOUT_MB}*1024)) $FLOWOUT_KB_TAG">>$LOG_PATH ##################################################################
######################CPU 通过/proc/stat计算######################
##################################################################
sys_idle_1=$(echo $cpulog_1 | awk '{print $4}')
total_1=$(echo $cpulog_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}') cpulog_2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
sys_idle_2=$(echo $cpulog_2 | awk '{print $4}')
total_2=$(echo $cpulog_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}') sys_idle=`expr $sys_idle_2 - $sys_idle_1`
total=`expr $total_2 - $total_1`
CPU_NOW=`echo "100-$sys_idle/$total*100"|bc -l|cut -d. -f1`
if [ $total -eq ] ;then
CPU_NOW=
elif [ ! -n "$CPU_NOW" ];then
CPU_NOW=
fi
CPU_TAG=`echo "$CPU_NOW $CPU_RATE"|awk '{tag=0;if($1>$2){tag=1} print tag}'`
echo "$time CPU $CPU_NOW $CPU_RATE $CPU_TAG">>$LOG_PATH ######################################################################################## #检查日志中是否有超过阈值的记录
function check_ifoverload()
{
all_count=`grep $ $LOG_PATH|awk '{if($6==1) print $0}'|wc -l`
latest_count=`tail -n $ $LOG_PATH|grep $|awk '{if($6==1) print $0}'|wc -l`
if [[ $all_count -eq && $latest_count -eq ]];then
do_sendmail $ $ $
fi
}
check_item=
check_ifoverload MEM $check_item $MEM_NOW'%' $MEM_RATE'%'
check_ifoverload CPU $check_item $CPU_NOW'%' $CPU_RATE'%'
check_ifoverload DISK $check_item $DISK_NOW'%' $DISK_RATE'%'
check_ifoverload ESTABLISHED $check_item $ESTABLISHED_NOW $ESTABLISHED
check_ifoverload TIME_WAIT $check_item $TIME_WAIT_NOW $TIME_WAIT
check_ifoverload FLOWIN_MB $check_item $FLOWIN_MB_NOW $FLOWIN_MB
check_ifoverload FLOWOUT_MB $check_item $FLOWOUT_MB_NOW $FLOWOUT_MB done
shell:实现linux服务器资源监控并发送告警邮件的更多相关文章
- Linux 服务器系统监控脚本 Shell【转】
转自: Linux 服务器系统监控脚本 Shell - 今日头条(www.toutiao.com)http://www.toutiao.com/i6373134402163048961/ 本程序在Ce ...
- Linux服务器上监控网络带宽的18个常用命令nload, iftop,iptraf-ng, nethogs, vnstat. nagios,运用Ntop监控网络流量
Linux服务器上监控网络带宽的18个常用命令 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量 ...
- 用 Python 脚本实现对 Linux 服务器的监控
目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统 ...
- 服务器资源监控插件(jmeter)
零.引言 我们对被测应用进行性能测试时,除了关注吞吐量.响应时间等应用自身的表现外,对应用运行所涉及的服务器资源的使用情况,也是非常重要的方面,通过 实时监控,可以准确的把握不同测试场景下服务器资源消 ...
- JMeter性能测试-服务器资源监控插件详解
零.引言 我们对被测应用进行性能测试时,除了关注吞吐量.响应时间等应用自身的表现外,对应用运行所涉及的服务器资源的使用情况,也是非常重要的方面,通过实时监控,可以准确的把握不同测试场景下服 ...
- linux 服务器性能监控(一)
这篇文章主要介绍一些常用的linux服务器性能监控命令,包括命令的常用参数.指标的含义以及一些交互操作. 几个问题 命令本身并不复杂,关键是你对操作系统基础知识的掌握和理解,先来看看下面几个问题: C ...
- (转)JMeter性能测试-服务器资源监控插件详解
零.引言 我们对被测应用进行性能测试时,除了关注吞吐量.响应时间等应用自身的表现外,对应用运行所涉及的服务器资源的使用情况,也是非常重要的方面,通过实时监控,可以准确的把握不同测试场景下服务器资源消耗 ...
- Python 脚本实现对 Linux 服务器的监控
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 原文地址 由于原文来自微信公众号,并且脚本都是图片,所以这里 ...
- Linux服务器上监控网络带宽的18个常用命令 zz
Linux服务器上监控网络带宽的18个常用命令 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量 ...
随机推荐
- 发布-订阅消息系统Kafka简介
转载请注明出处:http://www.cnblogs.com/BYRans/ Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式 ...
- MySQL:数据操作
数据操作 一.插入数据 1.所有字段插入数据 语法: insert into 数据表名(字段名) values(插入的数据);(标准)insert into 数据表名values(插入的数据); 实例 ...
- 剑指Offer 1. 二维数组中的查找 (数组)
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 安装jdk1.8
这是很普通的shell的脚本,只需要注意:echo 语句内出现的变量,需要转义! #!/bin/bash function get_current_time_stamp(){ echo `date & ...
- SQLI DUMB SERIES-7
(1)查看PHP源代码 可以看见输入的id被一对单引号和两对圆括号包围 (2)根据提示:Dump into Outfile可知,此次攻击需要导出文件 (3)在第一关获取 @@datadir 读取数据库 ...
- 小妖精的完美游戏教室——东方project,同人,自机
//================================================================ //// Copyright (C)// All Rights R ...
- C++ 值传递、指针传递、引用传递详解
C++ 值传递.指针传递.引用传递详解 最近写了几篇深层次讨论数组和指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以值传递形式” 数组和指针背后——内存角度 语义"陷阱&quo ...
- Java分布式锁
分布式锁简述 在单机时代,虽然不存在分布式锁,但也会面临资源互斥的情况,只不过在单机的情况下,如果有多个线程要同时访问某个共享资源的时候,我们可以采用线程间加锁的机制,即当某个线程获取到这个资源后,就 ...
- Linux shell脚本学习
1.cgmod +x ./文件 获取执行权限,使脚本具有执行权限 2. ./name.sh 执行脚本 ./为当前目录 直接使用name.sh系统会去PATH里面找name.sh,而PATH里只有/ ...
- Jekins学习
1.Windows 安装入门 https://blog.csdn.net/u011541946/article/details/78003772 PS:坑1,https问题 坑2,offline ...