【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%告警

(0)

相关推荐