基于SHELL编程实现的服务器监控报警脚本

监控脚本模版,需要可以下载,修改变量即可

1.进程监控,脚本配合crontab定时计划任务实现监控

#!/bin/bash
#系统进程监控脚本模板
#推荐监控频率:每30分钟一次
#======================================变量区===========================================
#邮件报警联系人
mail_list="报警邮件接收人,可添加多个,中间空格隔开"
#主机ip
ip=实际被监控的服务器ip
#主机名(例如:xxx应用A服务器)
host_name="xxx应用A服务器"
# 获取当前时间
DATE=$(date +"%Y-%m-%d %H:%M:%S")
#进程组(例如:nginx、mysqld)
processes=( nginx mysqld redis apollo nacos rabbitmq )
#企微报警函数
function Weichat(){
         # 请修改该为你的企业微信群组机器人
         local webhook_key="填写自己企微群机器人密码"
         # 发送get请求
         curl "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=$webhook_key" \
         -H 'Content-Type: application/json' \
         -d "{\"msgtype\": \"text\",\"text\": {\"content\": \"$resultMessages\"}}"
                  }
#======================================功能区===========================================
#进程检查
for process in ${processes[@]}
do
        ps -ef | grep "$process" | grep -v grep
        if [ $? -ne 0 ];then
	    echo "[警报] $host_name进程异常 主机ip:$ip 时间:$DATE 请注意检查" | mail -s "[进程警报]" $mail_list
	    resultMessages="[进程告警]\n\n[警报] $host_name进程异常 \n主机ip:$ip \n时间:$DATE \n异常进程:$process"
        Weichat
        fi
done

 2.CPU、内存、磁盘资源监控

#!/bin/bash
#监控频率:每天一次
#系统资源监控脚本模版
#此脚本适用于centOS7版本,centOS6版本不适用
#====================================变量区==========================================
#主机ip
ip="实际被监控服务器ip"
#主机名(例如:xxx应用A服务器)
host_name="xxx应用A服务器"
#邮件报警联系人
mail_list="邮件接收人,可写多个,中间空格隔开"
#企微群报警
Weichat(){
	local webhook_key="企微群机器人密码"
	curl "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=$webhook_key" \
	-H 'Content-Type: application/json' \
	-d "{\"msgtype\": \"text\",\"text\": {\"content\": \"$resultMessages\"}}"
	}
# 设置阈值(根据实际情况进行调整)
CPU_THRESHOLD=90
MEM_THRESHOLD=80
DISK_THRESHOLD=90
# 获取当前时间
DATE=$(date +"%Y-%m-%d %H:%M:%S")
#====================================功能区==========================================
# 监控 CPU 使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
	    # 在此处添加发送警报的逻辑(例如通过邮件或消息通知)
	    echo "[警报] $host_name CPU使用率过高!主机ip:$ip 当前使用率为: $CPU_USAGE% 时间:$DATE" | mail -s "[CPU告警]" $mail_list
	    resultMessages="[CPU告警]\n\n[警报] $host_name CPU使用率过高!\n主机ip:$ip\n当前使用率为: $CPU_USAGE% \n时间:$DATE"
	    Weichat
fi

# 监控内存使用率
MEM_USAGE=$(free | awk '/Mem/ {print $3/$2 * 100.0}')
if (( $(echo "$MEM_USAGE > $MEM_THRESHOLD" | bc -l) )); then
	    # 在此处添加发送警报的逻辑
	    echo "[警报] $host_name内存使用率过高!主机ip:$ip 当前使用率为: $MEM_USAGE% 时间:$DATE" | mail -s "[内存告警]" $mail_list
	    resultMessages="[内存告警]\n\n[警报] $host_name内存使用率过高!\n主机ip:$ip\n当前使用率为: $MEM_USAGE% \n时间:$DATE"
	    Weichat
fi

# 监控磁盘使用率
DISK_USAGE=$(df -h | awk 'NR>1{print $5}' | sed 's/%//g')
while read -r line; do
		if (( $(echo "$line > $DISK_THRESHOLD" | bc -l) )); then
		# 在此处添加发送警报的逻辑
		echo "[警报] $host_name磁盘使用率过高!主机ip:$ip 当前使用率为: $line% 时间:$DATE" | mail -s "[磁盘告警]" $mail_list
		resultMessages="[磁盘告警]\n\n[警报] $host_name磁盘使用率过高!\n主机ip:$ip\n当前使用率为: $line% \n时间:$DATE"
		Weichat
		fi
done <<< "$DISK_USAGE"

3.服务器带宽监控

#!/bin/bash
#此脚本用监控服务器带宽状态,适用centOS7版本
#检查频率:每30分钟一次
#===================================变量区========================================
#当前时间
DATE=$(date "+%Y-%m-%d %H:%M:%S")
#主机ip(按照实际ip修改)
ip=被监控机器ip
#应用名称(改成需要监控的系统名称)
host_name="xxx应用A机"
#定义邮件报警接收人
mail_list="邮件接收人"
#企业微信群报警
Weichat(){
	# 请修改该为你的企业微信群组机器人
	local webhook_key="实际企业微信群机器人密码"
	# 发送get请求
	curl "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=$webhook_key" \
	-H 'Content-Type: application/json' \
	-d "{\"msgtype\": \"text\",\"text\": {\"content\": \"$resultMessages\"}}"
	}
# 定义阈值为20 Mbps
THRESHOLD=20971520
#定义你想监控的网卡名,这里以eth0为例
eth="eth0"
#===================================功能区========================================
# 获取当前接收和发送的字节数
RX_OLD=$(cat /sys/class/net/$eth/statistics/rx_bytes)
TX_OLD=$(cat /sys/class/net/$eth/statistics/tx_bytes)
sleep 10
RX_NEW=$(cat /sys/class/net/$eth/statistics/rx_bytes)
TX_NEW=$(cat /sys/class/net/$eth/statistics/tx_bytes)
# 计算10秒平均带宽(单位:bps)
RX_BANDWIDTH=$((RX_NEW - RX_OLD))
TX_BANDWIDTH=$((TX_NEW - TX_OLD))
TOTAL_BANDWIDTH=$((RX_BANDWIDTH + TX_BANDWIDTH))
AVG_BANDWIDTH=$( expr $TOTAL_BANDWIDTH / 10 )
echo $AVG_BANDWIDTH
# 判断带宽是否超过阈值
if [ $AVG_BANDWIDTH -gt $THRESHOLD ]; then
	# 发送告警消息
	echo "[警报]$host_name网卡$eth带宽已超过阈值,时间:$DATE 主机ip:$ip 请及时检查!"  | mail -s "[带宽异常告警]" $mail_list
	resultMessages="[带宽异常告警]\n\n机器名:$host_name\n网卡:$eth\n主机ip:$ip\n时间:$DATE"
	Weichat
fi

4.磁盘I/O监控

#!/bin/bash

# 需要监控的磁盘名称
DEVICE_NAME='vdb'

# 获取上一秒钟设备的总I/O统计信息
get_io_stats() {
    cat /proc/diskstats | grep "$DEVICE_NAME "
}

# 计算I/O使用率(读写次数差值除以时间间隔)
calculate_io_utilization() {
    #时间间隔
    local time_interval=$1
    #新的读操作次数
    local read_ops_new=$2
    #新的写操作次数
    local write_ops_new=$3
    #旧的读操作次数
    local read_ops_old=$4
    #旧的写操作次数
    local write_ops_old=$5
    #新的读写操作次数总和   
    local total_ops_new=$((read_ops_new + write_ops_new))
    #旧的读写操作次数总和
    local total_ops_old=$((read_ops_old + write_ops_old))
    #计算单位时间读写操作次数之和
    local io_utilization=$(echo "scale=2; ($total_ops_new - $total_ops_old) / $time_interval" | bc)
    
    echo $io_utilization >> ~/io.txt
}

# 主循环
while true; do
    io_stats_old=$(get_io_stats)
    sleep 1
    io_stats_new=$(get_io_stats)
    #取值新   
    read_ops_new=$(echo $io_stats_new | awk '{print $4}')
    write_ops_new=$(echo $io_stats_new | awk '{print $8}')
    #取值旧
    read_ops_old=$(echo $io_stats_old | awk '{print $4}')
    write_ops_old=$(echo $io_stats_old | awk '{print $8}')
    #计算结果
    io_utilization=$(calculate_io_utilization 1 $read_ops_new $write_ops_new $read_ops_old $write_ops_old)
    
    echo "Disk I/O utilization: $io_utilization ops/s"
done

实际监控远比这些基本监控复杂,只要逻辑清晰,都可以实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值