流量监控服务器
#!/bin/bash
#监控系统负载与CPU、内存、硬盘、登录用户数。
#提取本服务器的IP地址信息
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
#注释:只输出eth0 inetaddr 这行,
#注释:以:为分隔符,提取第二串字符后,再取第一个字符
#输出服务器的IP地址信息
echo "IP地址信息:IP=$IP"
# 1、监控系统负载的变化情况
#抓取cpu的总核数
cpu_num=`grep -c 'model name' /proc/cpuinfo`
echo "cpu的总核数:cpu_num=$cpu_num"
#注释:Linux里有一个/proc目录,存放的是当前运行系统的虚拟映射,
#注释:其中有一个文件为cpuinfo,这个文件里存放着CPU的信息。
#注释:我们可以直接打开查看,或者过滤关键字进行查看,
#注释:因为文件内容比较多,所以一般我们需要过滤关键字。
#注释: grep 命令用于查找文件里符合条件的字符串。
#注释:grep-c 或 --count : 计算符合样式的列数。查找文件里符合条件的字符串
#注释:CPU是指中央处理器
#抓取当前系统15分钟的平均负载值
load_15=`uptime | awk '{print $NF}'`
echo "当前系统15分钟的平均负载值:load_15=$load_15"
#注释:(1)uptime命令可以用来查看
#注释:服务器已经运行了多久,
#注释:当前登录的用户有多少,
#注释:以及服务器在过去的1分钟、
#注释:5分钟、15分钟的系统平均负载值
#注释:(2)$NF代表:最后一个Field(列)
#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`
#scale=2 设小数位,2 代表保留两位:
echo "平均负载值:average_load=$average_load"
#取上面平均负载值的个位整数
average_int=`echo $average_load | cut -f 1 -d "."`
#以.为分隔符,提取第1个filed
echo "平均负载值的个位整数:average_int=$average_int"
#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
load_warn=0.70
echo "设置系统单个核心15分钟的平均负载的告警值为0.70:load_warn=$load_warn"
#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较
echo "********数据测试*****************"
average_int=2
echo "average_int=$average_int"
if (($average_int>0)); then
echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!"| mail -s "「1」 $IP 服务器系统负载严重告警!!!" 1545628287@qq.com
else
#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 )
load_now=`expr $average_load \> $load_warn`
#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员
if (($load_now == 1)); then
echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mail -s "$IP 服 务器系统负载严重告警!!!" 1545628287@qq.com
fi
fi
#注释cut
#cut 命令可以从一个文本文件或者文本流中提取文本列
#-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
#-c :以字符为单位进行分割。
#-d :自定义分隔符,默认为制表符。
#-f :与-d一起使用,指定显示哪个区域。
#-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
#范围之内,该字符将被写出;否则,该字符将被排除
# 2、监控系统cpu的情况,当使用超过80%的时候发告警邮件:
#取当前空闲cpu百份比值(只取整数部分)
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`
#
#注释:(1)top命令是Linux下常用的性能分析工具,
#注释:能够实时显示系统中各个进程的资源使用情况
#注释:(2)n 设置退出前屏幕刷新的次数,
#注释:b 将top输出编排成适合输出到文件的格式,可以使用这个选项创建进程日志
#注释:(3)$5个为空闲百分比
#d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
#q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
#c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
#S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
#s : 安全模式,将交谈式指令取消, 避免潜在的危机
#i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
#n : 更新的次数,完成后将会退出 top
#b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内
#awk:逐行扫描文件
#top命令可以看到总体的系统运行状态和cpu的使用率 。
#%us:表示用户空间程序的cpu使用率(没有通过nice调度)
#%sy:表示系统空间的cpu使用率,主要是内核程序。
#%ni:表示用户空间且通过nice调度过的程序的cpu使用率。
#%id:空闲cpu
#%wa:cpu运行时在等待io的时间
#%hi:cpu处理硬中断的数量
#%si:cpu处理软中断的数量
#%st:被虚拟机偷走的cpu
#注:99.0 id,表示空闲CPU,即CPU未使用率,100%-99.0%=1%,即系统的cpu使用率为1%。
echo "取当前空闲cpu百份比值:cpu_idle=$cpu_idle"
#设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告警
echo "设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告*********"
echo "********数据测试*****************"
cpu_idle=15
echo "空闲cpu百份比值:cpu_idle=$cpu_idle"
if (($cpu_idle < 20)); then
echo "$IP服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理。"| mail -s "「2」$IP 服务器系统负载严重告警!!!" 1545628287@qq.com
fi
#3、监控系统交换分区swap的情况,当使用超过80%的时候发告警邮件:
#swap分区是交换分区,是一定磁盘空间(分区或文件),用于将部分内存中的数据换下来,以腾出内存空间用于其他需求。
#在一个系统中,物理内存快使用完时,操作系统会使用交换分区。当系统内存紧张时,操作系统根据一定的算法规则,
#将一部分最近没使用的内存页面保存到交换分区,从而为需要内存的程序留出足够的内存空间;
#在swap中的内存页面被访问时,系统会将其重新载入到物理内存中去运行。
#系统分配的交换分区总量
swap_total=`free -m | grep Swap | awk '{print $2}'`
#Swap:表示硬盘上交换分区的使用情况(这里我们不去关心)
#系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存并不是第一行free 标记的 16936Kb,它仅代表#未被分配的内存。
#我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
echo "系统分配的交换分区总量:swap_total=$swap_total"
#当前剩余的交换分区free大小
swap_free=`free -m | grep Swap | awk '{print $4}'`
echo "当前剩余的交换分区free大小:swap_free=$swap_free"
#当前已使用的交换分区used大小
swap_used=`free -m | grep Swap | awk '{print $3}'`
echo "当前已使用的交换分区used大小:swap_used=$swap_used"
echo "******数据测试*******"
swap_used=980
echo "swap_used =$swap_used "
if (($swap_used != 0)); then
#如果交换分区已被使用,则计算当前剩余交换分区free所占总量的百分比,用小数来表示,要在小数点前面补一个整 数位0
echo "#如果交换分区已被使用,则计算当前剩余交换分区free所占总量的百分比,用小数来表示,要在小数点前面补 一个整数位0"
swap_per=0`echo "scale=2;$swap_free/$swap_total" | bc`
echo "swap_per=$swap_per"
#设置交换分区的告警值为20%(即使用超过80%的时候告警)。
swap_warn=0.20
echo ""
#当前剩余交换分区百分比与告警值进行比较(当大于告警值(即剩余20%以上)时会返回1,小于(即剩余不足20%)时会 返回0 )
swap_now=`expr $swap_per \> $swap_warn`
#如果当前交换分区使用超过80%(即剩余小于20%,上面的返回值等于0),立即发邮件告警
if (($swap_now == 0)); then
echo "$IP 服务器swap交换区只剩下$swap_free M 未使用,剩余不到20%"|mail -s "「3」$IP 服务器系统负载严重警告!!!" 1545628287@qq.com
fi
fi
# 4、监控系统硬盘根分区使用的情况,当使用超过80%的时候发告警邮件:
#取当前根分区(/dev/sda1)已用的百份比值(只取整数部分)
disk_sda1=`df -h | grep /dev/sda1 | awk '{print $5}' | cut -f 1 -d "%"`
echo "disk_sda1:$disk_sda1"
#设置空闲硬盘容量的告警值为80%,如果当前硬盘使用超过80%,立即发邮件告警
echo "*******测试数据*********"
disk_sda1=81
echo "disk_sda1:$disk_sda1"
if (($disk_sda1\>80)); then
echo "$IP 服务器 /根分区 使用率已经超过80%,请及时处理。"| mail -s "「4」$IP 服务器系统负载严重告警!!!" 1545628287@qq.com
fi
#5、监控系统用户登录的情况,当用户数超过3个的时候发告警邮件:
echo "5、监控系统用户登录的情况,当用户数超过3个的时候发告警邮件:"
echo "取当前用户登录数(只取数值部分)"
users=`uptime | awk '{print $6}'`
echo "users=$users"
echo "设置登录用户数的告警值为3个,如果当前用户数超过3个,立即发邮件告警"
echo "****测试数据*****"
users=5
echo "users=$users"
if (($users >= 3)); then
echo "测试登录用户"
echo "$IP 服务器用户数已经达到$users个,请及时处理。"| mail -s "「5」$IP 服务器系统负载严重告警!!!" 1545628287@qq.com
fi