【shell】五、一个系统监控脚本
创建一个脚本,名字叫sys_watch.sh。此脚本来源于《Linux shell 核心编程指南》,丁明一版本。
此脚本主要内容为:
1、创建系统时间、ip、可用内存、可用磁盘、cpu负载、登录用户、运行进程及其他vmstat的监控统计命令。
2、通过命令执行结果与阈值进行比较。如内存小于1G、硬盘小于10G。
3、如果比较结果超过阈值,发送比较结果给邮箱。
遇到的问题:
如果mail -s 邮箱命令报错,send-mail: fatal: parameter inet_interfaces: no local interface found for ::1
解决方案来源:https://blog.csdn.net/u013303402/article/details/53484093
1)
vim /etc/postfix/main.cf
2)设置
inet_interfaces = all
3)重启
service postfix restart
脚本如下:
[root@yaomm test]# vi sys_watch.sh
#/bin/bash
# 系统监控脚本
# 系统时间
local_time=$(date +'Y%m%d %H:%M:%S')
# 本机ip awk {'print $2'}==>获取第2组数据
local_ip=$(ifconfig eth0 | grep netmask | awk {'print $2'} )
# 可用内存 /proc/meminfo文件中存放了内存使用信息
free_mem=$(cat /proc/meminfo | grep Avai | awk {'print $2'} )
# 可用磁盘 grep '/$' ==> 获取以/结尾的行
free_disk=$(df | grep '/$' | awk {'print $3'})
# cpu负载
cpu_load=$(cat /proc/loadavg | awk {'print $3'} )
# 统计登录用户
login_user=$(who | wc -l)
# 统计运行进程
procs=$(ps aux | wc -l)
#---------------以下为vmstat统计数据
# cpu中断
irq=$( vmstat 1 2 | tail -n +4 | awk {'print $12'} )
# 上下文切换
cs=$( vmstat 1 2 | tail -n +4 | awk {'print $13'} )
# 用户态
usertime=$( vmstat 1 2 | tail -n +4 | awk {'print $14'})
# 系统态
systime=$( vmstat 1 2 | tail -n +4 | awk {'print $15'})
# I/O 等待
iowait=$( vmstat 1 2 | tail -n +4 | awk {'print $17'})
#------------------以下为阈值比较命令,\分割长语句,当做一条命令
# 剩余内存不足1G时发送邮件报警
if [[ $free_mem -lt 1048576 ]];then
# 打印内存及ip发送邮件
echo '$local_time free memory not enough. \
free_mem:$free_mem on $local_ip' \
| mail -s Warning root@localhost
fi
# 剩余磁盘不足10G时发送邮件报警
if [[ $free_mem -lt 1048576 ]];then
# 打印内存及ip发送邮件
echo '$local_time free disk not enough. \
free_disk:$free_disk on $local_ip' \
| mail -s Warning root@localhost
fi
# cpu 15分钟平均负载超过4时发送邮件
# cpu_load有浮点数,不能直接比较,需要用bc取整
#result=$(echo '$cpu_load > 4' | bc)
if [[ $cpu_load > 4 ]];then
# 打印cpu负载发送邮件
echo '$local_time cpu load to high. \
cpu 15 avgload:$free_mem on $local_ip' \
| mail -s Warning root@localhost
fi
# 在线人数超过3时告警
if [[ $login_user -gt 3 ]];then
# 打印发送邮件
echo '$local_time too many user. \
$login_user users login to $local_ip' \
| mail -s Warning root@localhost
fi
# 进程数量大于500时发送告警
if [[ $procs -gt 500 ]];then
# 打印发送邮件
echo '$local_time cpu Too many procs. \
$procs proc are runing on $local_ip' \
| mail -s Warning root@localhost
fi
# 其他,限于篇幅、时间,不再一一写出
# cpu中断大于5000告警
# cpu上下文切换大于5000告警
# 用户态进程占用cpu超过70%告警
# 内核态进程占用cpu超过70%告警
# cpu消耗大量时间在等待磁盘I/O超过40%告警