监控脚本模版,需要可以下载,修改变量即可
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
实际监控远比这些基本监控复杂,只要逻辑清晰,都可以实现