开发自己的监控系统一、email篇

前言

随着维护服务器量的增多,越来越觉得监控的重要性。监控,就是运维人员的眼睛,没有了监控,你不知道磁盘是否满了,网络流量是否超标,甚至服务器是否宕机。监控的重要性不言而喻。市面上的监控软件也很多,如商业版的ipmontor、opmanager,免费开源的nagios、cacti等。每个监控软件都有各自优缺点和应用场景,这里不去探讨。本文要探讨的是从一个初学者的角度去打造属于自己的监控系统。共分为三部分:email篇web篇移动篇(android)。好了,不废话了,下面开始。

email篇

关键字:shell、email

原理

定时执行监控脚本,提取服务器运行状态,如系统负载、磁盘空间或是相关服务是否运行等,只要有一项异常,即马上发送邮件警报。下面是脚本内容(由于只是个事例,所以只设定了两个监控项目,大家根据自己的需求增减监控项目)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
#Server status monitor
#by caishzh 2013

#初始化变量及设置阀值
DIR="/root/tool"
NOW=$(date "+%F %T")
>${DIR}/messages.txt #先清空messages.txt里的内容

ADMIN="[email protected]" #邮箱地址,用于接收警报邮件
HOSTNAME="Server1"
IP=$(ifconfig eth0|grep 'inet addr'|sed 's/.*addr:\(.*\) Bcast:.*/\1/')

UPTIME_MAX=3 #系统负载
DISK_MAX=90 #磁盘使用率

#系统负载
UPTIME=$(uptime|sed 's/^.*age: \(.*\)$/\1/')
UPTIME_NOW=$(echo $UPTIME|awk -F',' '{print $1}')
if echo "$UPTIME_NOW>$UPTIME_MAX"|bc >/dev/null;then #UPTIME_NOW包含小数,而test只支持整数间的比较,所以这里使用bc
echo "UPTIME: $UPTIME" >>${DIR}/messages.txt
fi

#根分区
DISK=$(df -h|grep /$|awk '{print $5,$2,$4}')
DISK_USAGE=$(echo $DISK|awk '{print $1}'|tr -d '%')
[ "$DISK_USAGE" -ge "$DISK_MAX" ] && $(echo "DISK: $DISK" >> ${DIR}/messages.txt)

#如果messages.txt文件不为空则发送警报信
if [ -s ${DIR}/messages.txt ];then
mail -s "system monitor: $NOW $IP $HOSTNAME" "$ADMIN" <${DIR}/messages.txt
fi

将脚本放到/root/tool目录下,给予执行权限:

1
chmod 755 /root/tool/system_monitor.sh

放入crontab中,每3分钟执行一次:

1
echo "*/3 * * * * root /root/tool/system_monitor.sh" >>/etc/crontab

实际生产环境下执行该脚本后收到的警报邮件:
1567499143107

参考:

简单的系统监控脚本
鸟哥的linux私房菜–学习shell scripts