1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| #!/bin/bash
# 配置参数 THRESHOLD=1024 # 内存报警阈值(MB) CHECK_INTERVAL=60 # 检查间隔(秒),如果作为定时任务可注释 MAIL="example@mail.com" # 接收报警的邮箱 LOG_FILE="/var/log/memory_monitor.log" # 日志文件路径
# 确保日志文件存在 touch $LOG_FILE chmod 644 $LOG_FILE
# 日志函数 log() { echo "[$(date +%F" "%H:%M:%S)] $1" >> $LOG_FILE }
# 获取系统信息 get_system_info() { DATE=$(date +%F" "%H:%M) # 兼容不同版本的ifconfig输出 IP=$(hostname -I | awk '{print $1}') # 更可靠的IP获取方式 if [ -z "$IP" ]; then IP=$(ifconfig | grep 'inet ' | grep -v '127.0.0.1' | head -1 | awk '{print $2}') fi }
# 获取内存信息 get_memory_info() { # 使用更详细的内存计算方式 MEM_INFO=$(free -m | grep Mem) TOTAL=$(echo $MEM_INFO | awk '{print $2}') USED=$(echo $MEM_INFO | awk '{print $3}') FREE=$(echo $MEM_INFO | awk '{print $4}') BUFFER=$(echo $MEM_INFO | awk '{print $6}') CACHE=$(echo $MEM_INFO | awk '{print $7}') # 实际可用内存 = 空闲内存 + 缓冲区 + 缓存 AVAILABLE=$((FREE + BUFFER + CACHE)) # 内存使用率(百分比) USAGE_RATE=$((USED * 100 / TOTAL)) }
# 发送报警邮件 send_alert() { SUBJECT="内存报警: $IP 内存不足" BODY=" 服务器内存使用率过高,请及时处理! 日期时间: $DATE 服务器IP: $IP 总内存: $TOTAL MB 已用内存: $USED MB 空闲内存: $FREE MB 缓冲内存: $BUFFER MB 缓存内存: $CACHE MB 实际可用内存: $AVAILABLE MB 内存使用率: $USAGE_RATE% 报警阈值: $THRESHOLD MB " echo "$BODY" | mail -s "$SUBJECT" $MAIL log "发送内存报警邮件至 $MAIL" }
# 主函数 main() { get_system_info get_memory_info # 记录内存状态 log "内存状态 - 总内存: $TOTAL MB, 已用: $USED MB, 可用: $AVAILABLE MB, 使用率: $USAGE_RATE%" # 检查是否需要报警 if [ $AVAILABLE -lt $THRESHOLD ]; then log "内存不足! 可用内存 $AVAILABLE MB 低于阈值 $THRESHOLD MB" send_alert fi }
# 如果作为独立脚本运行,循环监控;如果作为定时任务,只运行一次 if [ "$1" != "cron" ]; then while true; do main sleep $CHECK_INTERVAL done else main fi
|
v1.3.10