开发系统监控脚本
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}'
使用 mpstat 命令提取 CPU 使用率, 先安装需安装 sysstat 软件包
[root@localhost opt]# yum -y install sysstat
- [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 命令提取出内存使用率,
[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 监控脚本
先编辑变量文件
使用用 df 命令提取出根分区的磁盘占用率, 赋值给变量 DUG
? 使用 mpstat 命令提取 CPU 使用率, 赋值给变量 CUG
? 使用 free 命令提取出内存使用率, 赋值给变量 MUG
编辑警告信息配置文件
出现以下任一情况时告警: 磁盘占用率超过 90%,CPU 使用率超过 80%,
内存使用率超过 90%, 告警邮件通过 mail 命令发送到指定邮箱
生成告警文件, 配置如下
[ $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 警告文件中
当有告警文件产生时, 就发送邮件,
[ -f /tmp/warrin.txt ] && cat /tmp/warrin.txt | mail -s "警告"$amail && rm -rf /tmp/warrin.txt ### 当 / tmp/warrin.txt 有文件生成时, 就发送邮件, 并删除 / tmp/warrin.txt
整篇配置如下
### 设置邮箱服务, 添加第三方服务器发送邮件.
在邮箱配置文件 VIM /etc/mail.rc 添加如下文件.
set bsdcompat set from=913149555@qq.com ### 对方收到邮件时显示的发件人 set smtp="smtps://smtp.qq.com:465" ### 指定第三方发送邮件的 smtp 服务器地址 set smtp-auth-user=913149555@qq.com ### 第三方发邮件的用户名 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? #重启服务
测试, 修改参数, 生成告警文件, 并检验邮箱是否发送.
运行程序
./sysmon.sh
可以看到邮件
改回参数, 编辑计划任务文件
crontab -e 添加计划任务, 在里面添加该配置文件
[root@localhost opt]# systemctl start crond.service ### 开启计划任务 [root@localhost opt]# crontab -e ### 编辑计划任务 /30 /opt/sysmon.sh ### / 表示每隔 30 分钟, 后面运行程序不用加点, 直接运行
先做一分钟测试
查看计划任务状态
每隔一分钟会收到一封邮件
表示计划任务也设置成功了.
在将其改回 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
来源: http://www.bubuko.com/infodetail-2946381.html