目录
[六、监控系统中的IO await大于50进行邮件告警](#六、监控系统中的IO await大于50进行邮件告警)
七、监控系统中的网络流量下载上传超过10M(可变)进行邮件告警
一、配置文件别名设置
bash
#!/bin/bash
# 配置文件路径
CONFIG_FILE="/opt/export/config.conf"
# 日志文件路径
LOG_FILE="/opt/export/resource_monitor.log"
# 错误日志文件路径
ERROR_LOG_FILE="/opt/export/resource_monitor_error.log"
# 当前时间戳(统一日志时间格式:年-月-日 时:分:秒)
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
#邮箱
mail="1239114231@qq.com"
#当前服务器
hostname=Why
# 初始化报警标志
has_alert=false
# 初始化报警信息数组
alert_messages=()
二、邮箱脚本
bash
vim sendemail.sh
#!/bin/bash
if [ $# -ne 3 ];then
echo "Usage: $0 <email> <subject> <content>"
exit 1
fi
EMAIL="$1" # 接收邮箱
SUBJECT="$2" # 标题
CONTENT="$3" # 内容
FROM_EMAIL="1239114231@qq.com" # 发送邮箱
AUTH_CODE="tyyuihbgxstdbagi" # SMTP授权
码
sendemail -f "$FROM_EMAIL" \
-t "$EMAIL" \
-s smtp.qq.com:587 \
-u "$SUBJECT" \
-m "$CONTENT" \
-xu "$FROM_EMAIL" \
-xp "$AUTH_CODE" \
-o tls=yes
三、监控系统中的cpu使用率超过80%进行邮件告警
bash
#cpu监控
check_cpu()
{
cpu_yuzhi=80 #cpu阈值
#获取cpu使用率
cpu_use=$(top -bn1 |grep Cpu|awk '{print $2}'|cut -d. -f1)
echo "[$CURRENT_TIME] cpu检查结果: cpu当前使用率为$cpu_use%" >>"$LOG_FILE"
#检查cpu使用率
if (( $cpu_use >= $cpu_yuzhi )) ; then
# 已使用cpu所占百分比超过阈值
alert_msg="警告:CPU使用率超过 ${cpu_yuzhi}%,当前使用率为 ${cpu_use}%。"
echo "$alert_msg" >&2
echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
alert_messages+=("$alert_msg")
has_alert=true
fi
}
四、监控系统中的内存使用率超过80%进行邮件告警
bash
#内存监控
check_Mem()
{
Mem_yuzhi=80 #内存阈值
#获取内存使用率
Mem_use=$(free|awk '/Mem/{print int(100*$3/$2)}')
echo "[$CURRENT_TIME] 内存检查结果:内存当前使用率为$Mem_use%" >>"$LOG_FILE"
#检查内存使用率
if (( $Mem_use >= $Mem_yuzhi )) ; then
# 已使用内存所占百分比超过阈值
alert_msg="警告:内存使用率超过 ${Mem_yuzhi}%,当前使用率为 ${Mem_use}%。"
echo "$alert_msg" >&2
echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
alert_messages+=("$alert_msg")
has_alert=true
fi
echo "check_Mem调用成功,当前使用率为$Mem_use%"
}
五、监控系统中的硬盘使用率超过80%进行邮件告警
bash
#磁盘监控
check_disk()
{
yuzhi=80 #磁盘阈值
#获取磁盘使用率
use=$(df / | awk 'NR==2{print int(100*($3/$2))}')
echo "[$CURRENT_TIME] 磁盘检查结果: / 文件系统当前使用率为$use%" >>"$LOG_FILE"
#检查磁盘使用率
if (( $use >= $yuzhi )) ; then
# 已使用磁盘空间所占百分比超过阈值
alert_msg="警告:根文件系统磁盘使用率超过 ${yuzhi}%,当前使用率为 ${use}%。"
echo "$alert_msg" >&2
echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
alert_messages+=("$alert_msg")
has_alert=true
fi
echo "check_disk调用成功,当前使用率为$use%"
}
六、监控系统中的IO await大于50进行邮件告警
bash
#io await 监控
check_io()
{
io_yuzhi=50 #io阈值
#获取io 使用率
io_use=$(iostat|awk 'NR==4{print $4}'|cut -d. -f1 )
echo "[$CURRENT_TIME] io检查结果: 当前io await为$io_use%" >>"$LOG_FILE"
#检查io 使用率
if (( $io_use >= $io_yuzhi )) ; then
# io await所占百分比超过阈值
alert_msg="警告:IO Await 超过 ${io_yuzhi}ms,当前为 ${io_use}ms。"
echo "$alert_msg" >&2
echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
alert_messages+=("$alert_msg")
has_alert=true
fi
echo "check_io调用成功,当前使用率为$io_use%"
}
七、监控系统中的网络流量下载上传超过10M(可变)进行邮件告警
bash
#网络流量下载上传监控
check_net()
{
net_yuzhi=10240 #上传下载阈值 KB/s
#获取网络流量上传下载速率
net_use_down=$(sar -n DEV 1 3|grep ens33|awk 'NR==4{print $5}'|cut -d. -f1)
net_use_up=$(sar -n DEV 1 3|grep ens33|awk 'NR==4{print $6}'|cut -d. -f1)
echo "[$CURRENT_TIME] 检查结果: 当前下载速率为:$net_use_down kb/s 上传速率为:$net_use_up kb/s" >>"$LOG_FILE"
#检查网络流量上传下载速率
if (( $net_use_down >= $net_yuzhi )) ; then
# 已使用网络流量下载速率超过阈值
alert_msg="警告:网络流量下载速率超过 ${net_yuzhi} KB/s,当前下载速率为 ${net_use_down} KB/s。"
echo "$alert_msg" >&2
echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
alert_messages+=("$alert_msg")
has_alert=true
fi
if (( $net_use_up >= $net_yuzhi )) ; then
alert_msg="警告:网络流量上传速率超过 ${net_yuzhi} KB/s,当前上传速率为 ${net_use_up} KB/s。"
echo "$alert_msg" >&2
echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
alert_messages+=("$alert_msg")
has_alert=true
fi
echo "check_net调用成功,当前上传率为$net_use_up kb/s 下载速率为$net_use_down kb/s"
}
八、发送报警邮箱
bash
# 执行所有检查
check_cpu
check_Mem
check_disk
check_io
check_net
# 输出最近10条日志
cat $LOG_FILE | tail -10
# 发送邮件 - 仅在发生报警时发送
if [ "$has_alert" = true ]; then
echo "检测到资源超过阈值,正在发送报警邮件..."
# 构建邮件内容,每个报警信息占一行
email_content=$(printf "%s\n" "${alert_messages[@]}")
# 在邮件内容前加上服务器标识
email_content="主机: $hostname
报警时间: $CURRENT_TIME
$email_content"
# 调用发送邮件的脚本
# sendemail.sh 用法: ./sendemail.sh <收件人> <主题> <正文>
/root/sendemail.sh "$mail" "[资源报警] - $hostname" "$email_content" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "[$CURRENT_TIME] 报警邮件发送成功。" >> "$LOG_FILE"
else
echo "[$CURRENT_TIME] 错误:报警邮件发送失败!" >> "$ERROR_LOG_FILE"
fi
else
echo "[$CURRENT_TIME] 所有资源检查正常,无需发送报警邮件。" >> "$LOG_FILE"
echo "所有资源检查正常。"
fi
-- 插入 --
九、结果显示

