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

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

文件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服务运行

    • 自动重启确保持续监控

    • 日志集成到系统日志

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

相关推荐
曦云沐12 分钟前
【避坑指南】Ubuntu更新报错“Repository is not signed”的快速修复
linux·ubuntu·docker
小魏小魏我们去那里呀38 分钟前
Alibaba Cloud DevOps Integration For JetBrains 插件使用指南
ide·阿里云·devops·jetbrains
带土11 小时前
10. .out文件
linux
Exquisite.1 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql
STCNXPARM1 小时前
Linux camera之V4L2子系统详解
android·linux·camera·v4l2架构
yueyuexiaokeai12 小时前
linux kernel常用函数整理
linux·c语言
郝亚军3 小时前
ubuntu-18.04.6-desktop-amd64安装步骤
linux·运维·ubuntu
Konwledging4 小时前
kernel-devel_kernel-headers_libmodules
linux
Web极客码4 小时前
CentOS 7.x如何快速升级到CentOS 7.9
linux·运维·centos
一位赵4 小时前
小练2 选择题
linux·运维·windows