开发系统监控脚本

1、需求描述 
编写名为sysmon.sh的Shell监控脚本
监控内容包括CPU使用率、内存使用率、根分区的磁盘占用率
百分比只需精确到个位,如7%、12%、23%等
出现以下任一情况时告警:磁盘占用率超过90%、CPU使用率超过80%、
内存使用率超过90%,告警邮件通过mail命令发送到指定邮箱
结合crond服务,每半小时执行一次监控脚本 

2、思路与命令测试
 分析:监控内容包括CPU使用率、内存使用率、根分区的磁盘占用率
df 命令
awk  命令
mpstat  命令(需安装sysstat软件包)
free 命令
crontab 命令
3、脚本编程与调试
 使用用df命令提取出根分区的磁盘占用率,赋值给变量DUG
 使用mpstat命令提取CPU使用率,赋值给变量CUG
 使用free命令提取出内存使用率,赋值给变量MUG
 使用if语句判断上述监控项目是否超标,将需要告警的信息保存到/tmp/alert.txt文件;若该存在则作为告警邮件发送
 调试优化并设置crontab计划

使用用df命令提取出根分区的磁盘占用率
df -hT |grep "/$" |awk '{print $6}' |awk -F% '{print $1}'
开放系统监控shell脚本
使用mpstat命令提取CPU使用率,先安装需安装sysstat软件包
[root@localhost opt]# yum -y install sysstat
开放系统监控shell脚本
开放系统监控shell脚本_第1张图片

[root@localhost opt]# id=$(mpstat |grep all |awk '{print $12}' |awk -F"." '{print $1}')
[root@localhost opt]# echo "$id"
99
[root@localhost opt]# u=expr 100 - $id
[root@localhost opt]#
[root@localhost opt]# echo "$u"
1

使用free命令提取出内存使用率,
开放系统监控shell脚本_第2张图片
[root@localhost ~]# total=$( free -m |grep Mem |awk '{print $2}' )
[root@localhost ~]# echo $total ###捞取总内存
976
[root@localhost ~]# used=$( free -m |grep Mem |awk '{print $3}' )
[root@localhost ~]# echo $used ###捞取使用的内存。
589
[root@localhost ~]# mug=expr $used \* 100 / $total ### 这里我们要用到运算,使用的除以总的,但是直接除是小数,我们需要的是百分比,在则expr只能算整数运算,所以的先乘以100,得到的数值也是整数部分
[root@localhost ~]# echo $mug
60

编辑脚本信息编写名为sysmon.sh的Shell监控脚本

  1. 先编辑变量文件
    使用用df命令提取出根分区的磁盘占用率,赋值给变量DUG
     使用mpstat命令提取CPU使用率,赋值给变量CUG
     使用free命令提取出内存使用率,赋值给变量MUG
    开放系统监控shell脚本
    编辑警告信息配置文件
    出现以下任一情况时告警:磁盘占用率超过90%、CPU使用率超过80%、
    内存使用率超过90%,告警邮件通过mail命令发送到指定邮箱

生成告警文件,配置如下
开放系统监控shell脚本
[ $DUG -ge 90 ] && echo "根分区内存使用率超标达到:$DUG %" >> /tmp/warrin.txt
###当根分区内存使用率大于 90 %,输出报警信息,并定向保存到/tmp/warrin.txt警告文件中
[ $CUG -ge 80 ] && echo "cpu使用率超标达到: $CUG %" >> /tmp/warrin.txt
###当cpu使用率大于 80 %,输出报警信息,并定向保存到/tmp/warrin.txt警告文件中
[ $MUG -ge 90 ] && echo "内存使用率超标达到: $MUG %" >> /tmp/warrin.txt
###当内存使用率大于 90 %,输出报警信息,并定向保存到/tmp/warrin.txt警告文件中
开放系统监控shell脚本
当有告警文件产生时,就发送邮件,

[ -f /tmp/warrin.txt ] && cat /tmp/warrin.txt | mail -s "警告"$amail && rm -rf /tmp/warrin.txt
###当/tmp/warrin.txt有文件生成时,就发送邮件,并删除/tmp/warrin.txt

整篇配置如下
开放系统监控shell脚本_第3张图片

###设置邮箱服务,添加第三方服务器发送邮件。
在邮箱配置文件 vim /etc/mail.rc 添加如下文件。
set bsdcompat
set [email protected] ###对方收到邮件时显示的发件人
set smtp="smtps://smtp.qq.com:465" ###指定第三方发送邮件的smtp服务器地址
set [email protected] ### 第三方发邮件的用户名
set smtp-auth-password=vyluygwcaxnabajc ###邮箱密码使用SMTP授权码
set smtp-auth=login ###SMTP的认证方式。默认是LOGIN,也可改为CRAM-MD5或PLAIN方式
set nss-config-dir=/etc/pki/nssdb ###存放认证证书的地址
set ssl-verify=ignore ###ssl协议发送

[root@localhost opt]# systemctl restart postfix.service  #重启服务

测试,修改参数,生成告警文件,并检验邮箱是否发送。
开放系统监控shell脚本

运行程序
./sysmon.sh
可以看到邮件
开放系统监控shell脚本_第4张图片
改回参数,编辑计划任务文件
crontab –e 添加计划任务,在里面添加该配置文件

[root@localhost opt]# systemctl start crond.service ###开启计划任务
[root@localhost opt]# crontab -e ###编辑计划任务
/30 /opt/sysmon.sh ### /表示每隔30分钟,后面运行程序不用加点,直接运行
先做一分钟测试
开放系统监控shell脚本
查看计划任务状态
开放系统监控shell脚本_第5张图片
每隔一分钟会收到一封邮件
开放系统监控shell脚本_第6张图片
表示计划任务也设置成功了。
在将其改回30,就可以了

再发送邮件时,出现的一些问题及解决办法:
Resolving host /smtp.qq.com . . .Could not resolve host: /smtp.qq.com"/root/dead.letter" 11/330
. . . message not sent.
是域名解析不成功,解决办法:
在vim /etc/resolv.conf #在本文件中增加一条记录,必须写在第一个,因为这个文件时顺序执行,会解析第一个nameserver,第一个解析不了再去解析下一个
nameserver 114.114.114.114

如果遇到,503错误,smtp-server: 535 Error
那代表你的邮箱还没开启smpt服务。 QQ邮箱登录后,设置–>帐号–>pop3/smtp,开启,然后QQ邮箱还会给出授权码,就是上面配置时候填的smtp-auth-passwd。

· · 连接超时 ,防火墙和核心防护没关。
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0