1. 目标shell脚本需求说明:
1、监控系统中的cpu、内存、硬盘、、使用率超过80%进行邮件告警(可使用邮箱163、QQ、139等)
2、监控系统中的IO await大于50进行邮件告警(可使用邮箱163、QQ、139等)
3、监控系统中的网络流量下载上传超过10M(可变)进行邮件告警(可使用邮箱163、QQ、139等)
2. 脚本内容
#! /bin/bash
# ======================
# 配置区(使用前必须修改!)
# ======================
# 监控阈值设置
CPU_ALERT=80 # CPU使用率超过80%报警
MEM_ALERT=80 # 内存使用率超过80%报警
DISK_ALERT=80 # 磁盘使用率超过80%报警
IO_ALERT=50 # 磁盘IO等待超过50ms报警
NET_ALERT=10 # 网络流量超过10MB/s报警
# 网络接口设置(用ifconfig命令查看)
NET_IF="ens33"
# 邮件设置(使用QQ邮箱)
TO_EMAIL="136043670@qq.com" # 接收报警的邮箱
SMTP_SERVER="smtp.qq.com" # QQ邮箱SMTP服务器
SMTP_PASSWD="kwmwcqypzawkbgif" #QQ邮箱提供的授权码
SMTP_PORT="587" # QQ邮箱端口
SMTP_USER="136043670@qq.com" # 发件邮箱(需开通SMTP服务)
# ======================
# 邮件服务器初始化检查
# ======================
check_email_config() {
if ! command -v msmtp &> /dev/null; then
echo "错误:msmtp未安装,请先执行安装步骤!"
exit 1
fi
if [ ! -f ~/.msmtprc ]; then
echo "错误:邮件配置文件 ~/.msmtprc 不存在"
echo "请按照教程配置邮件服务器"
exit 1
fi
}
# ======================
# 监控功能函数
# ======================
# 发送邮件报警
send_alert() {
local subject=$1
local message=$2
# 组合邮件内容
local email_content="Subject: $subject\n\n$message\n\n监控时间: $(date)"
# 发送邮件
echo -e "$email_content" | msmtp --from="$SMTP_USER" "$TO_EMAIL"
if [ $? -eq 0 ]; then
echo "邮件发送成功: $subject"
else
echo "邮件发送失败,请检查邮件配置"
fi
}
# 检查CPU使用率
check_cpu() {
local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
local cpu_rounded=$(printf "%.0f" $cpu_usage)
echo "当前CPU使用率:${cpu_rounded}%"
if [ $cpu_rounded -ge $CPU_ALERT ]; then
send_alert "CPU报警" "CPU使用率过高:${cpu_rounded}% (阈值${CPU_ALERT}%)"
fi
}
# 检查内存使用率
check_memory() {
local mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
local mem_rounded=$(printf "%.0f" $mem_usage)
echo "当前内存使用率:${mem_rounded}%"
if [ $mem_rounded -ge $MEM_ALERT ]; then
send_alert "内存报警" "内存使用率过高:${mem_rounded}% (阈值${MEM_ALERT}%)"
fi
}
# 检查磁盘空间
check_disk() {
local disk_usage=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')
echo "当前根分区使用率:${disk_usage}%"
if [ $disk_usage -ge $DISK_ALERT ]; then
send_alert "磁盘报警" "磁盘空间不足:${disk_usage}% (阈值${DISK_ALERT}%)"
fi
}
# 检查磁盘IO
check_io() {
if ! command -v iostat &> /dev/null; then
echo "警告:iostat命令未安装,跳过IO检查"
return
fi
local io_wait=$(iostat -x | awk '/^[a-z]/ {print $10}' | head -1)
local io_rounded=$(printf "%.0f" $io_wait)
echo "当前磁盘IO等待:${io_rounded}ms"
if [ $io_rounded -ge $IO_ALERT ]; then
send_alert "IO报警" "磁盘IO等待过高:${io_rounded}ms (阈值${IO_ALERT}ms)"
fi
}
# 检查网络流量
check_network() {
if [ ! -d "/sys/class/net/$NET_IF" ]; then
echo "错误:网络接口 $NET_IF 不存在"
return
fi
# 获取当前流量(字节)
local rx_bytes=$(cat /sys/class/net/$NET_IF/statistics/rx_bytes)
local tx_bytes=$(cat /sys/class/net/$NET_IF/statistics/tx_bytes)
# 转换为MB/s
local rx_mbps=$(echo "scale=2; $rx_bytes / 1024 / 1024" | bc)
local tx_mbps=$(echo "scale=2; $tx_bytes / 1024 / 1024" | bc)
echo "当前网络流量:下载 ${rx_mbps}MB/s 上传 ${tx_mbps}MB/s"
if (( $(echo "$rx_mbps >= $NET_ALERT" | bc -l) )); then
send_alert "网络报警" "下载流量过高:${rx_mbps}MB/s (阈值${NET_ALERT}MB/s)"
fi
if (( $(echo "$tx_mbps >= $NET_ALERT" | bc -l) )); then
send_alert "网络报警" "上传流量过高:${tx_mbps}MB/s (阈值${NET_ALERT}MB/s)"
fi
}
# ======================
# 主程序
# ======================
echo "====== 系统监控开始 ======"
echo "监控时间:$(date)"
echo "--------------------------"
# 检查邮件配置
check_email_config
# 执行所有监控检查
check_cpu
check_memory
check_disk
check_io
check_network
echo "--------------------------"
echo "监控完成:$(date)"
echo "====== 监控结束 ======"
3. 运行脚本
1.将脚本保存为simple_monitor.sh
2.修改脚本开头的配置参数(特别是邮箱地址)
3.给执行权限:chmod +x simple_monitor.sh
4.测试运行:./simple_monitor.sh
[root@localhost shelldemo]# ./0906zuoye.sh
====== 系统监控开始 ======
监控时间:2025年 09月 06日 星期六 22:59:41 CST
--------------------------
当前CPU使用率:25%
当前内存使用率:12%
当前根分区使用率:37%
当前磁盘IO等待:0ms
当前网络流量:下载 102.09MB/s 上传 15.67MB/s
邮件发送成功: 网络报警
邮件发送成功: 网络报警
--------------------------
监控完成:2025年 09月 06日 星期六 22:59:44 CST
====== 监控结束 ======
运行成功,脚本编辑完成。