当前位置: 首页 > news >正文

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

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

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

}

主监控逻辑

main_check() {
# 记录当前状态
log “内存检查: 使用率 ${mem_used}% | 交换分区 ${swap_used}%”

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

    • 自动重启确保持续监控

    • 日志集成到系统日志

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

http://www.dtcms.com/a/507727.html

相关文章:

  • 网站建设费用做什么科目思明自助建站软件
  • php网站开发实战教程app和网站开发语言的区别
  • 引领未来交易:达普韦伯全链路Swap交易所系统开发解决方案
  • 2.CUDA编程模型
  • YOLOV4
  • MES系统如何实现生产过程数据采集与管控?
  • 医保局网站建设dw网页设计作品简单
  • 网站如何更换空间wordpress镜像什么意思
  • 使用Yum安装Redis
  • Verilog和FPGA的自学笔记7——流水灯与时序约束(XDC文件的编写)
  • 蜜蜂及飞行昆虫多类别检测数据集VOC+YOLO格式3630张6类别
  • 从零开始:在 TCP 基础上手动搭建 ModBus TCP 协议
  • 台州的网站建设wordpress动漫展主题
  • 外贸假发 网站南京网站设计制作公司排名
  • 【C++闯关笔记】模板的特化
  • iOS flutter 上架 4.3(a)【flutter 专讲】
  • 【鸿蒙flutter】flutter_echarts和webview_flutter 兼容问题解决
  • flutter 鸿蒙
  • 重庆潼南网站建设公司企业网站建设示范平台
  • 临沂做网站哪家好西安的互联网公司
  • Linux下的DNS配置文件/etc/resolv.conf详解(1)
  • MyBatis 中 #{ } 与 ${ } 的区别与使用场景
  • C++源代码行数统计工具的设计与实现
  • temBoard:一款开源PostgreSQL监控和管理工具
  • 模型上下文协议(MCP)——使用Java构建SQL数据库代理(MCP代理教程)
  • GEO内容更新与迭代策略:内容性能的持续优化流程
  • LeeCode 24. 两两交换链表中的节点
  • 怎么查一个网站有没有做301章丘营销型网站设计公司
  • 深圳宝安网站推广昆山建设监察大队网站
  • 最近军事新闻热点大事件汉阳网站推广优化