服务器监控有专业的程序,比如springboot-admin。其实可以手工利用shell配合crond搭建一个轻量级的监控系统,云服务器不便宜,将内存和cpu还给应用系统,低碳运维从我走起。

磁盘监控

磁盘使用的增长速度一般可预期,达到阀值即报警,一天一次的频率足以,比如设置为凌晨1点。监控脚本示例如下:

#!/bin/bash
partition_list=(`df -h | awk 'NF>3&&NR>1{sub(/%/,"",$(NF-1));print $NF,$(NF-1)}'`)
critical=90 # 阀值

notification_email()
{
    email_addr="用户名@liming.pub"
    title="[Warn]xx服务器磁盘空间报警"
    mail -s "$title" "${email_addr}"
}

crit_info=""
for (( i=0;i<${#partition_list[@]};i+=2 ))
do
    if [ "${partition_list[((i+1))]}" -lt "$critical" ];then
        echo "OK! ${partition_list[i]} used ${partition_list[((i+1))]}%"
    else
        if [ "${partition_list[((i+1))]}" -gt "$critical" ];then
            crit_info=$crit_info"Warning!!! ${partition_list[i]} used ${partition_list[((i+1))]}%\n"
        fi
    fi
done
if [ "$crit_info" != "" ];then
    echo "发送邮件报警:"$crit_info
    echo -e $crit_info | notification_email  # (1)
fi
  1. 发送邮件通知,可以参考 Linux发送邮件 博文。

MYSQL备库监控

备库如未投入生产,监控频率一天一次,如果投入生产,则需要频率高一点,比如5分钟一次。监控脚本示例如下:

#!/bin/bash
#define mysql variable
db_user=""
db_passwd=""
db_name=""
db_port=""
db_host=""

notification_email()
{
    email_addr="用户名@liming.pub"
    title="[Warn]xxMySQL出问题了"
    mail -s "$title" "${email_addr}"
}

mysql_status=`netstat -lnt|grep ${db_port}|wc -l`
if [ "$mysql_status" -eq 1 ];then
    slave_status_array=($(mysql -u${db_user} -p${db_passwd} -h${db_host} -P${db_port} -e "show slave status\G"|grep Running|awk -F : '{print $2}'))
    if [ "${slave_status_array[0]}" == "Yes" ] && [ "${slave_status_array[1]}" == "Yes" ]; then
        [ -f "/tmp/slave" ] && rm -f /tmp/slave
    else
        [ ! -f "/tmp/slave" ] && echo "MySQL主备同步失效!" | notification_email
        touch /tmp/slave
    fi
    [ -f "/tmp/mysql_down" ] && rm -f /tmp/mysql_down
else
    [ ! -f "/tmp/mysql_down" ] && echo "Mysql宕机!" | notification_email
    touch /tmp/mysql_down
fi

Redis监控

监控Redis进程,不存在则报警,并尝试重启。也可以使用 redis-cli 命令监控连接数。

#!/bin/bash

notification_email()
{
    email_addr="用户名@liming.pub"
    title="[ERROR]xxRedis宕机了"
    mail -s "$title" "${email_addr}"
}

pid=$(ps -ef | grep redis-server | grep -v grep | awk '{print $2}')

if [ "$pid" = '' ]; then
    echo "Redis-Server xx 宕机,尝试重启!" | notification_email
    redis-server /etc/redis.conf &
fi

通用监控

可以使用 curl 来实现远程http服务的监控,使用 netstat 来实现本机服务端口的监控,具体脚本后续完善。