以下是一个用于实时监控内存和根分区使用情况,并在超过阈值时发送邮件报警的Shell脚本:
#!/bin/bash
# 内存和磁盘空间监控脚本
# 配置参数
MEM_THRESHOLD=80 # 内存使用百分比报警阈值(%)
DISK_THRESHOLD=90 # 根分区使用百分比报警阈值(%)
CHECK_INTERVAL=300 # 检查间隔时间(秒)5分钟
ADMIN_EMAIL="root" # 管理员邮箱
# 获取内存使用百分比
get_mem_usage() {
free | awk '/Mem/{printf "%.0f", $3/$2*100}'
}
# 获取根分区使用百分比
get_disk_usage() {
df / | awk 'NR==2{print $5}' | tr -d '%'
}
# 发送报警邮件
send_alert() {
local subject=$1
local message=$2
echo "$message" | mail -s "$subject" "$ADMIN_EMAIL"
}
# 监控循环
while true; do
# 获取当前使用率
mem_usage=$(get_mem_usage)
disk_usage=$(get_disk_usage)
# 生成报警信息
alert_msg=""
# 内存检测
if [ "$mem_usage" -ge "$MEM_THRESHOLD" ]; then
alert_msg+="内存使用率过高: ${mem_usage}% (阈值 ${MEM_THRESHOLD}%)\n"
fi
# 磁盘检测
if [ "$disk_usage" -ge "$DISK_THRESHOLD" ]; then
alert_msg+="根分区使用率过高: ${disk_usage}% (阈值 ${DISK_THRESHOLD}%)\n"
fi
# 发送报警
if [ -n "$alert_msg" ]; then
send_alert "[系统警报] 资源使用超标" "$alert_msg"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 已发送报警邮件"
fi
# 等待下次检测
sleep $CHECK_INTERVAL
done
使用说明
1、保存脚本
sudo nano /usr/local/bin/system_monitor.sh
2、设置执行权限
sudo chmod +x /usr/local/bin/system_monitor.sh
3、配置邮件系统
# 安装邮件服务(Ubuntu/Debian)
sudo apt install mailutils
# 测试邮件发送
echo "测试邮件内容" | mail -s "测试邮件" root
4、后台运行脚本
nohup /usr/local/bin/system_monitor.sh > /dev/null 2>&1 &
功能特性
1、双阈值检测
内存和磁盘分别设置独立阈值
支持百分比整数比较
2、复合报警机制
同时触发内存和磁盘报警时的邮件内容:
Subject: [系统警报] 资源使用超标
内存使用率过高: 85% (阈值 80%)
根分区使用率过高: 95% (阈值 90%)
3、运行日志记录
[2023-10-05 16:30:00] 已发送报警邮件
[2023-10-05 16:35:00] 已发送报警邮件
进阶配置
1、系统服务化
创建systemd服务文件 /etc/systemd/system/system-monitor.service:
[Unit]
Description=System Resource Monitor
[Service]
ExecStart=/usr/local/bin/system_monitor.sh
Restart=always
[Install]
WantedBy=multi-user.target
2、邮件模板优化
添加详细系统信息:
send_alert() {
local subject=$1
local message=$2
local full_msg="主机名: $(hostname)\nIP地址: $(hostname -I)\n报警时间: $(date)\n\n$message"
echo -e "$full_msg" | mail -s "$subject" "$ADMIN_EMAIL"
}
3、报警频率控制
防止重复报警:
# 在脚本开头添加
LAST_ALERT_TIME=0
MIN_ALERT_INTERVAL=3600 # 最小报警间隔1小时
# 在发送报警前检查
current_time=$(date +%s)
if [ $((current_time - LAST_ALERT_TIME)) -ge $MIN_ALERT_INTERVAL ]; then
echo -e "$alert_msg" | mail -s "$subject" "$ADMIN_EMAIL"
LAST_ALERT_TIME=$current_time
fi
监控验证方法
1、手动触发磁盘报警
# 创建临时大文件
fallocate -l 10G /testfile
2、手动触发内存报警
# 使用stress工具制造内存压力(需安装)
stress --vm 1 --vm-bytes 90% # 占用90%内存
注意事项
1、权限要求
需要root权限获取准确的磁盘使用信息
建议使用root用户运行脚本
2、性能影响
检查间隔不宜小于60秒
可通过/proc/meminfo优化内存检测:
awk '/MemTotal/{total=$2}/MemAvailable/{avail=$2}END{print (total-avail)/total*100}' /proc/meminfo
3、容器环境适配
在Docker容器中运行时,需挂载/proc和/sys文件系统:
docker run -v /proc:/host/proc -v /sys:/host/sys ...
通过此脚本,您可以有效监控关键系统资源,及时接收报警信息,保障业务系统的稳定运行。建议配合Zabbix、Prometheus等监控系统构建完整的监控体系。