阿里云创建交换分区、设置内存监控预警和自动处理内存占用过大进程的脚本

以下是完整的自动化内存管理解决方案,包含三个脚本文件:

文件1:创建交换分区脚本

文件名: create_swap.sh

#!/bin/bash

创建交换分区脚本

用法:sudo ./create_swap.sh

设置交换文件大小(4GB)

SWAP_SIZE="4G"

SWAP_FILE="/swapfile"

echo "正在创建交换分区..."

检查是否已有交换分区

if swapon --show | grep -q "$SWAP_FILE"; then

echo "交换分区已存在,跳过创建"

exit 0

fi

创建交换文件

if ! fallocate -l SWAP_SIZE SWAPFILE2\>/dev/null;thenecho"fallocate失败,使用dd方式创建交换文件..."ddif=/dev/zeroof=SWAP_FILE 2\>/dev/null; then echo "fallocate失败,使用dd方式创建交换文件..." dd if=/dev/zero of=SWAPFILE2\>/dev/null;thenecho"fallocate失败,使用dd方式创建交换文件..."ddif=/dev/zeroof=SWAP_FILE bs=1M count=((4*1024)) status=progress

fi

设置权限

chmod 600 $SWAP_FILE

格式化为交换分区

mkswap $SWAP_FILE

启用交换分区

swapon $SWAP_FILE

永久生效配置

echo "$SWAP_FILE none swap sw 0 0" >> /etc/fstab

优化交换分区使用策略

sysctl vm.swappiness=30

echo "vm.swappiness=30" >> /etc/sysctl.conf

sysctl vm.vfs_cache_pressure=50

echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf

echo "交换分区创建完成:"

swapon --show

文件2:智能内存监控脚本

文件名: smart_memory_guard.sh

#!/bin/bash

智能内存监控与自动处理脚本

自动运行,无需手动执行

配置参数

MEM_THRESHOLD=85 # 内存使用阈值(%)

SWAP_THRESHOLD=70 # 交换分区使用阈值(%)

PROCESS_THRESHOLD=20 # 单个进程内存占用阈值(%)

LOG_FILE="/var/log/memory_guard.log"

EMAIL="admin@example.com" # 替换为你的邮箱

获取内存使用情况

mem_used=(free \| awk '/Mem/{printf("%.0f"), 3/KaTeX parse error: Expected 'EOF', got '}' at position 6: 2*100}̲') swap_used=(free | awk '/Swap/{if(2!=0) printf("%.0f"), 3/$2*100; else printf "0"}')

记录日志

log() {

echo "[(date '+%Y-%m-%d %H:%M:%S')\] 1" >> $LOG_FILE

logger -t "MemoryGuard" "$1" # 同时记录到系统日志

}

发送邮件通知

send_alert() {

subject="内存告警 - $(hostname)"

echo -e "1"∣mail−s"1" | mail -s "1"∣mail−s"subject" $EMAIL

log "已发送告警邮件至: $EMAIL"

}

清理缓存

clean_cache() {

sync

echo 3 > /proc/sys/vm/drop_caches

log "已清理系统缓存"

}

智能识别异常进程

find_abnormal_processes() {

获取内存占用前10的进程

ps -eo pid,user,%mem,rss,comm --sort=-rss | awk -v threshold=$PROCESS_THRESHOLD '

BEGIN {

print "检测高内存进程:"

}

NR>1 && NR<=11 {

记录所有进程

printf "进程: %-15s PID: %-8s 用户: %-10s 内存: %-5s%% RSS: %-10sKB\n", 5, 1, 2, 3, $4

if ($3 > threshold) {

标记需要处理的进程

abnormal[1\] = 0

}

}

END {

if (length(abnormal) > 0) {

print "发现异常高内存进程:"

for (pid in abnormal) {

print abnormal[pid]

}

} else {

print "未发现超过阈值("threshold"%)的进程"

}

}'

}

处理高内存进程

handle_processes() {

log "开始检测异常进程..."

analysis=(findabnormalprocesses)log"(find_abnormal_processes) log "(findabnormalprocesses)log"analysis"

复制代码
# 提取需要处理的进程
ps -eo pid,%mem,comm --sort=-%mem | awk -v threshold=$PROCESS_THRESHOLD 'NR>1 && $2 > threshold' > /tmp/high_mem_procs

if [ -s /tmp/high_mem_procs ]; then
    log "准备处理高内存进程:"
    cat /tmp/high_mem_procs >> $LOG_FILE
    
    # 尝试终止进程
    while read -r pid mem comm; do
        # 排除关键进程
        if [[ "$comm" =~ (systemd|sshd|bash|sh|agetty|memory_guard|crond) ]]; then
            log "跳过关键进程: $comm (PID: $pid)"
            continue
        fi
        
        log "尝试终止进程: $comm (PID: $pid, 内存: ${mem}%)"
        kill -9 $pid 2>/dev/null
        
        # 检查是否终止成功
        if ps -p $pid > /dev/null; then
            log "进程终止失败: $comm (PID: $pid)"
        else
            log "进程已终止: $comm (PID: $pid)"
        fi
    done < /tmp/high_mem_procs
    
    # 发送详细告警
    send_alert "服务器内存告警\n主机: $(hostname)\n内存使用: ${mem_used}%\n交换分区使用: ${swap_used}%\n\n终止的进程:\n$(cat /tmp/high_mem_procs)"
else
    log "未发现超过${PROCESS_THRESHOLD}%内存占用的进程"
fi

}

主监控逻辑

main_check() {

记录当前状态

log "内存检查: 使用率 {mem_used}% \| 交换分区 {swap_used}%"

复制代码
if [ $mem_used -ge $MEM_THRESHOLD ] || [ $swap_used -ge $SWAP_THRESHOLD ]; then
    log "内存告警: 超过阈值! (内存 ${mem_used}% | 交换分区 ${swap_used}%)"
    
    # 第一步:清理缓存
    clean_cache
    sleep 10
    
    # 重新检查
    mem_used=$(free | awk '/Mem/{printf("%.0f"), $3/$2*100}')
    swap_used=$(free | awk '/Swap/{if($2!=0) printf("%.0f"), $3/$2*100; else printf "0"}')
    log "清理缓存后: 内存 ${mem_used}% | 交换分区 ${swap_used}%"
    
    if [ $mem_used -ge $MEM_THRESHOLD ] || [ $swap_used -ge $SWAP_THRESHOLD ]; then
        log "清理缓存后仍超阈值,开始处理高内存进程..."
        
        # 第二步:处理高内存进程
        handle_processes
        
        # 最后检查
        sleep 30
        mem_used=$(free | awk '/Mem/{printf("%.0f"), $3/$2*100}')
        if [ $mem_used -ge $MEM_THRESHOLD ]; then
            log "警告: 系统内存仍超阈值(${mem_used}%),建议手动检查"
            send_alert "紧急: 服务器内存持续过高\n主机: $(hostname)\n当前内存使用: ${mem_used}%\n请立即处理!"
        fi
    else
        log "清理缓存后恢复正常"
        send_alert "内存已恢复: 主机: $(hostname)\n当前内存使用: ${mem_used}%"
    fi
fi

}

执行主检查

main_check

文件3:一键部署脚本

文件名: auto_deploy.sh

#!/bin/bash

一键部署自动化内存管理

用法:sudo ./auto_deploy.sh

echo "正在部署智能内存监控系统..."

创建脚本目录

mkdir -p /opt/scripts

1. 创建交换分区

echo "步骤1: 创建交换分区"

cp create_swap.sh /opt/scripts/

chmod +x /opt/scripts/create_swap.sh

/opt/scripts/create_swap.sh

2. 安装监控脚本

echo "步骤2: 安装智能监控脚本"

cp smart_memory_guard.sh /opt/scripts/

chmod +x /opt/scripts/smart_memory_guard.sh

3. 设置定时监控

echo "步骤3: 设置定时监控任务"

(crontab -l 2>/dev/null; echo "*/5 * * * * /opt/scripts/smart_memory_guard.sh >> /var/log/memory_guard.log 2>&1") | crontab -

4. 创建日志文件

echo "步骤4: 创建日志文件"

touch /var/log/memory_guard.log

chmod 644 /var/log/memory_guard.log

5. 启用系统服务

echo "步骤5: 启用系统服务"

cat > /etc/systemd/system/memory-guard.service << EOF

Unit

Description=Smart Memory Guard Service

After=network.target

Service

Type=simple

ExecStart=/opt/scripts/smart_memory_guard.sh

Restart=always

RestartSec=60

StandardOutput=syslog

StandardError=syslog

SyslogIdentifier=MemoryGuard

Install

WantedBy=multi-user.target

EOF

systemctl daemon-reload

systemctl enable memory-guard.service

systemctl start memory-guard.service

6. 安装邮件服务(如果未安装)

echo "步骤6: 检查邮件服务"

if ! command -v mail &> /dev/null; then

echo "安装邮件服务..."

if [ -f /etc/redhat-release ]; then

yum install -y mailx postfix

systemctl enable postfix

systemctl start postfix

else

apt-get install -y mailutils

fi

fi

echo ""
echo "部署完成!智能内存监控系统已启用"
echo "------------------------------------------"
echo "监控频率: 每5分钟检查一次"
echo "日志文件: /var/log/memory_guard.log"
echo "查看日志: tail -f /var/log/memory_guard.log"
echo "服务状态: systemctl status memory-guard.service"
echo "交换分区: swapon --show"
echo ""

执行步骤

  1. 准备脚本文件:

    创建脚本文件

    nano create_swap.sh

    粘贴第一个脚本内容,保存退出

    nano smart_memory_guard.sh

    粘贴第二个脚本内容,保存退出

    nano auto_deploy.sh

    粘贴第三个脚本内容,保存退出

    设置执行权限

    chmod +x create_swap.sh smart_memory_guard.sh auto_deploy.sh

  2. 执行一键部署:

    sudo ./auto_deploy.sh

  3. 验证部署:

    检查交换分区

    swapon --show

    检查服务状态

    systemctl status memory-guard.service

    查看监控日志

    tail -f /var/log/memory_guard.log

系统功能说明

  1. 自动创建交换分区:

    • 创建4GB交换文件

    • 优化系统内存使用策略

    • 永久生效配置

  2. 智能内存监控:

    • 每5分钟自动检查内存使用

    • 超过阈值时自动清理缓存

    • 识别并终止异常高内存进程

    • 排除关键系统进程

  3. 自动预警系统:

    • 内存超过85%时发送邮件告警

    • 包含详细的内存使用情况

    • 列出被终止的进程信息

  4. 系统服务集成:

    • 作为systemd服务运行

    • 自动重启确保持续监控

    • 日志集成到系统日志

这个解决方案完全自动化,部署后无需人工干预,系统会自动处理内存问题并发送预警通知。

相关推荐
曦樂~5 小时前
【Qt】TCP连接--客户端和服务器
服务器·网络·c++·qt·tcp/ip
派阿喵搞电子5 小时前
在阿里云通过docker部署srs流媒体服务器(支持webrtc、http-flv)
阿里云·docker·webrtc
TG_yunshuguoji5 小时前
阿里云渠道商:阿里云哪些功能很必要?
服务器·阿里云·云计算
zwjapple5 小时前
阿里云安装docker-compose
阿里云·docker·云计算
zwjapple5 小时前
阿里云配置了加速器还是访问不了docker.io的解决方案。
阿里云·docker·云计算
TG_yunshuguoji5 小时前
阿里云代理商:如何给阿里云配置网络ACL?
服务器·网络·阿里云·云计算
迎風吹頭髮6 小时前
Linux内核架构浅谈60-Linux块设备驱动:请求队列与BIO结构的交互流程
linux·运维·交互
☆璇6 小时前
【Linux】Socket编程TCP
linux·服务器·tcp/ip
智星云算力7 小时前
Ubuntu 25.10 “Questing Quokka” 版本解析
服务器·gpu算力·一体机·智星云·ai工作站