开发工具

如何实时监视本机内存、分区剩余空间,报警邮件推送?

以下是一个用于实时监控内存和根分区使用情况,并在超过阈值时发送邮件报警的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等监控系统构建完整的监控体系。