shell入门11-一个系统性能监控脚本
2022-12-30 本文已影响0人
万州客
学习,就是不断的敲打键盘吧。
一个晚上的成果,边和同事开会,边打打字。
一,代码
#!/bin/bash
# 本脚本获取系统各项性能参数指标,并根据预设阈值决定是否给管理员发送邮件进行报警
# 变量定义列表如下
# time:时间,local_ip: enp0s3网卡IP,free_mem:剩余内存大小,free_disk:剩余磁盘大小
# cpu_load:15min平均负载,login_user:登录系统的用户,procs:当前进程数量
local_time=$(date +"%Y%m%d %H:%M:%S")
echo "local_time:" $local_time
local_ip=$(ifconfig enp0s3|grep netmask|tr -s " "|cut -d" " -f3)
echo "local_ip:" $local_ip
free_mem=$(cat /proc/meminfo|grep Avai|tr -s " "|cut -d" " -f2)
echo "free_mem:" $free_mem
free_disk=$(df|grep "/$"|tr -s " "|cut -d' ' -f4)
echo "free_disk:" $free_disk
cpu_load=$(cat /proc/loadavg|cut -d' ' -f3)
echo "cpu_load:" $cpu_load
login_user=$(who|wc -l)
echo "login_user:" $login_user
procs=$(ps aux|wc -l)
echo "procs:" $procs
# 以后使用awk比,tr,cut会更好些更简单些
# vmstat 命令可以查看系统中CPU的中断数,上下文切换数量
# CPU处理I/O等待时间,用户态及系统态消耗CPU的统计数据
# vmstat命令输出的前两2行信息是头部信息,第3行信息为开机到当时的平均数据
# 第4行开始的数据是每秒钟的实时数据,tail -n +4 表示删掉前3行从第4行信息开始显示
# irq:中断,cs:上下文切换,usertime:用户态
# CPU,systime:系统态CPU,iowait:等待I/O时间
irq=$(vmstat 1 2|tail -n +4|tr -s ' '|cut -d' ' -f12)
echo "irq:" $irq
cs=$(vmstat 1 2|tail -n +4|tr -s ' '|cut -d' ' -f13)
echo "cs: " $cs
usertime=$(vmstat 1 2|tail -n +4|tr -s ' '|cut -d' ' -f14)
echo "usertime:" $usertime
systime=$(vmstat 1 2|tail -n +4|tr -s ' '|cut -d' ' -f15)
echo "systime:" $systime
iowait=$(vmstat 1 2|tail -n +4|tr -s ' '|cut -d' ' -f17)
echo "iowait:" $iowait
# 下面很多命令,因为内容比较长,无法在一行显示,所以使用了\强制换行
# 使用强制换行符后,允许将一个命令在多行中输入
#当剩余内存不足1GB时发送邮件给root进行报警
[ $free_mem -lt 1048576 ] && \
echo "$local_time Free memory not enough.
Free_mem:$free_mem on $local_ip" | \
mail -s Warning root@localhost
# 当剩余磁盘不足10GB时发送邮件给root进行报警
[ $free_disk -lt 10485760 ] && \
echo "$local_time Free disk not enough.
root_free_disk:$free_disk on $local_ip" | \
mail -s Warning root@localhost
# 当CPU的15min平均负载超过4时发送邮件给root进行报警
result=$(echo "$cpu_load > 4"|bc)
[ $result -eq 1 ] && \
echo "$local_time CPU load to high
CPU 15 averageload:$cpu_load on $local_ip"|\
mail -s Warning root@localhost
# 当系统实时在线人数超过3人时发送邮件给root进行报警
[ $login_user -gt 3 ] && \
echo "$local_time Too many user.
$login_user users login to $local_ip"|\
mail -s Warning root@localhost
# 当实时进程数据大于500时发送邮件给root进行报警
[ $procs -gt 500 ] && \
echo "$local_time Too many procs.
$procs proc are runing on $local_ip"|\
mail -s Warning root@localhost
# 当实时CPU中断大于5000时发送邮件给root进行报警
[ $irq -gt 5000 ] && \
echo "$local_time Too many interupts.
There are $irq interupts on $local_ip"|\
mail -s Warning root@localhost
# 当实时CPU上下文切换数量大于5000时发送邮件给root进行报警
[ $cs -gt 5000 ] && \
echo "$local_time Too many Content Switches.
$cs of context switches per second on $local_ip"|\
mail -s Warning root@localhost
# 当用户态进程占用CPU超70%时发送邮件给root进行报警
[ $usertime -gt 70 ] && \
echo "$local_time CPU load to high.
Time spend runing non-kernel code:$usertime on $local_ip"|\
mail -s Warning root@localhost
# 当内核态进程占用CPU超过70时,报警
[ $systime -gt 70 ] && \
echo "systime -gt 70 warning"|\
mail -s Warning root@localhost
# 当CPU消耗大量时间等待磁盘I/O时,报警
[ $iowait -gt 40 ] && \
echo "iowait -gt 40 warning..."
二,输出
local_time: 20221227 07:44:35
local_ip: 192.168.1.211
free_mem: 7614792
free_disk: 31453900
cpu_load: 0.04
login_user: 2
procs: 159
irq: 158
cs: 143
usertime: 0
systime: 0
iowait: 0