系统资源监控与邮件告警脚本

1. Shell脚本内容

#!/bin/bash

# 监控配置
CPU_THRESHOLD=80          # CPU使用率阈值(%)
MEMORY_THRESHOLD=80      # 内存使用率阈值(%)
DISK_THRESHOLD=80        # 磁盘使用率阈值(%)
IO_AWAIT_THRESHOLD=50    # IO await阈值
NETWORK_THRESHOLD=10     # 网络流量阈值(MB/s)
CHECK_INTERVAL=60        # 检查间隔(秒)

# 邮件配置 - 请根据实际情况修改
SMTP_SERVER="smtp.126.com"  # 邮件服务器,如smtp.qq.com, smtp.139.com
SMTP_PORT="25"              # 邮件服务器端口,通常25或465
SMTP_USER="your_email@126.com"  # 发件人邮箱
SMTP_PASS="your_password"    # 发件人密码/授权码
RECIPIENT="recipient@example.com"  # 收件人邮箱
SUBJECT_PREFIX="[系统告警] "  # 邮件主题前缀

# 临时文件
TMP_DIR="/tmp/system_monitor"
mkdir -p $TMP_DIR
CPU_TMP="$TMP_DIR/cpu.tmp"
MEMORY_TMP="$TMP_DIR/memory.tmp"
DISK_TMP="$TMP_DIR/disk.tmp"
IO_TMP="$TMP_DIR/io.tmp"
NET_TMP_1="$TMP_DIR/net1.tmp"
NET_TMP_2="$TMP_DIR/net2.tmp"

# 发送邮件函数
send_alert() {
    local subject="$1"
    local message="$2"
    
    echo -e "Subject:$SUBJECT_PREFIX$subject\nTo:$RECIPIENT\nFrom:$SMTP_USER\n\n$message" | \
    sendmail -S "$SMTP_SERVER:$SMTP_PORT" -au"$SMTP_USER" -ap"$SMTP_PASS" $RECIPIENT
    
    if [ $? -eq 0 ]; then
        echo "告警邮件已发送: $subject"
    else
        echo "邮件发送失败: $subject"
    fi
}

# 监控CPU使用率
monitor_cpu() {
    local cpu_usage=$(top -b -n 1 | grep "Cpu(s)" | awk '{print $2 + $4}')
    local cpu_usage_int=$(echo "$cpu_usage" | cut -d '.' -f 1)
    
    echo "CPU使用率: $cpu_usage%"
    
    if [ $cpu_usage_int -ge $CPU_THRESHOLD ]; then
        local message="CPU使用率超过阈值($CPU_THRESHOLD%)\n当前使用率: $cpu_usage%"
        send_alert "CPU使用率过高" "$message"
    fi
}

# 监控内存使用率
monitor_memory() {
    local mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    local mem_usage_int=$(echo "$mem_usage" | cut -d '.' -f 1)
    
    echo "内存使用率: $mem_usage%"
    
    if [ $mem_usage_int -ge $MEMORY_THRESHOLD ]; then
        local message="内存使用率超过阈值($MEMORY_THRESHOLD%)\n当前使用率: $mem_usage%"
        send_alert "内存使用率过高" "$message"
    fi
}

# 监控磁盘使用率
monitor_disk() {
    local disk_usage=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
    
    echo "磁盘使用率: $disk_usage%"
    
    if [ $disk_usage -ge $DISK_THRESHOLD ]; then
        local message="磁盘使用率超过阈值($DISK_THRESHOLD%)\n当前使用率: $disk_usage%"
        send_alert "磁盘使用率过高" "$message"
    fi
}

# 监控IO await
monitor_io() {
    local io_await=$(iostat -x | grep -v "Device" | awk '{print $10}' | sort -nr | head -1)
    local io_await_int=$(echo "$io_await" | cut -d '.' -f 1)
    
    echo "IO await: $io_await"
    
    if [ $io_await_int -ge $IO_AWAIT_THRESHOLD ]; then
        local message="IO await超过阈值($IO_AWAIT_THRESHOLD)\n当前值: $io_await"
        send_alert "IO性能异常" "$message"
    fi
}

# 监控网络流量
monitor_network() {
    # 获取第一次网络统计
    cat /proc/net/dev | grep -v "lo" | grep -v "Inter" > $NET_TMP_1
    sleep 1
    # 获取第二次网络统计
    cat /proc/net/dev | grep -v "lo" | grep -v "Inter" > $NET_TMP_2
    
    # 计算每个接口的流量
    while read -r interface rx1 tx1; do
        # 从第二次统计中获取对应接口的数据
        rx2=$(grep "$interface" $NET_TMP_2 | awk '{print $2}')
        tx2=$(grep "$interface" $NET_TMP_2 | awk '{print $10}')
        
        # 计算差值(字节)
        rx_diff=$((rx2 - rx1))
        tx_diff=$((tx2 - tx1))
        
        # 转换为MB/s (1 MB = 1024 * 1024 bytes)
        rx_mb=$(echo "scale=2; $rx_diff / 1024 / 1024" | bc)
        tx_mb=$(echo "scale=2; $tx_diff / 1024 / 1024" | bc)
        
        echo "网络接口 $interface: 下载 $rx_mb MB/s, 上传 $tx_mb MB/s"
        
        # 检查下载是否超过阈值
        rx_compare=$(echo "$rx_mb > $NETWORK_THRESHOLD" | bc)
        if [ $rx_compare -eq 1 ]; then
            local message="网络下载流量超过阈值($NETWORK_THRESHOLD MB/s)\n接口: $interface\n当前下载速度: $rx_mb MB/s"
            send_alert "网络下载流量过高" "$message"
        fi
        
        # 检查上传是否超过阈值
        tx_compare=$(echo "$tx_mb > $NETWORK_THRESHOLD" | bc)
        if [ $tx_compare -eq 1 ]; then
            local message="网络上传流量超过阈值($NETWORK_THRESHOLD MB/s)\n接口: $interface\n当前上传速度: $tx_mb MB/s"
            send_alert "网络上传流量过高" "$message"
        fi
    done < <(awk '{print $1, $2, $10}' $NET_TMP_1)
}

# 主监控函数
main_monitor() {
    echo "===== 开始系统监控 ====="
    echo "监控时间: $(date)"
    
    monitor_cpu
    monitor_memory
    monitor_disk
    monitor_io
    monitor_network
    
    echo "===== 监控结束 ====="
    echo
}

# 检查是否安装了必要工具
check_dependencies() {
    local dependencies=("sendmail" "bc" "iostat" "top" "free" "df")
    local missing=0
    
    for dep in "${dependencies[@]}"; do
        if ! command -v $dep &> /dev/null; then
            echo "错误: 未安装必要工具 $dep"
            missing=1
        fi
    done
    
    if [ $missing -eq 1 ]; then
        echo "请先安装缺失的工具再运行脚本"
        exit 1
    fi
}

# 显示帮助信息
show_help() {
    echo "系统资源监控脚本"
    echo "用法: $0 [选项]"
    echo "选项:"
    echo "  -h, --help    显示帮助信息"
    echo "  -o, --once    仅执行一次监控"
    echo "  -i, --interval  指定监控间隔(秒), 默认60秒"
    echo
    echo "配置说明:"
    echo "  请先修改脚本中的邮件配置信息"
    echo "  可调整脚本开头的阈值参数"
}

# 解析命令行参数
run_once=0
while [[ $# -gt 0 ]]; do
    case "$1" in
        -h|--help)
            show_help
            exit 0
            ;;
        -o|--once)
            run_once=1
            shift
            ;;
        -i|--interval)
            CHECK_INTERVAL="$2"
            shift 2
            ;;
        *)
            echo "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
done

# 检查依赖
check_dependencies

# 运行监控
if [ $run_once -eq 1 ]; then
    main_monitor
else
    while true; do
        main_monitor
        sleep $CHECK_INTERVAL
    done
fi

# 清理临时文件
rm -rf $TMP_DIR

2. 脚本使用说明

  1. 配置修改:使用前需要修改脚本中的邮件配置部分:

    • SMTP_SERVER:根据您使用的邮箱选择对应的 SMTP 服务器
    • SMTP_USER:发件人邮箱地址
    • SMTP_PASS:邮箱密码或授权码(部分邮箱如 163 需要使用授权码)
    • RECIPIENT:接收告警的邮箱地址
  2. 阈值调整:脚本开头的阈值参数可以根据实际需求调整:

    • CPU、内存、硬盘使用率阈值(默认 80%)
    • IO await 阈值(默认 50)
    • 网络流量阈值(默认 10MB/s)
    • 检查间隔(默认 60 秒)
  3. 安装依赖:确保系统安装了必要工具:

    sudo apt-get install sendmail bc sysstat  # Debian/Ubuntu
    sudo yum install sendmail bc sysstat      # CentOS/RHEL
    
  4. 运行方式

    # 赋予执行权限
    chmod +x system_monitor.sh
    
    # 仅执行一次监控
    ./system_monitor.sh -o
    
    # 以默认间隔(60秒)持续监控
    ./system_monitor.sh
    
    # 自定义监控间隔(如30秒)
    ./system_monitor.sh -i 30
    

  5. 后台运行:可以使用 nohup 让脚本在后台持续运行:

    nohup ./system_monitor.sh &
    

该脚本会在系统资源超过设定阈值时发送告警邮件,包含具体的资源使用情况,方便您及时了解系统状态。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值