阿里云创建交换分区、设置内存监控预警和自动处理内存占用过大进程的脚本
以下是完整的自动化内存管理解决方案,包含三个脚本文件:
文件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"∣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_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 "”
执行步骤
-
准备脚本文件:
创建脚本文件
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
-
执行一键部署:
sudo ./auto_deploy.sh -
验证部署:
检查交换分区
swapon --show
检查服务状态
systemctl status memory-guard.service
查看监控日志
tail -f /var/log/memory_guard.log
系统功能说明
-
自动创建交换分区:
• 创建4GB交换文件• 优化系统内存使用策略
• 永久生效配置
-
智能内存监控:
• 每5分钟自动检查内存使用• 超过阈值时自动清理缓存
• 识别并终止异常高内存进程
• 排除关键系统进程
-
自动预警系统:
• 内存超过85%时发送邮件告警• 包含详细的内存使用情况
• 列出被终止的进程信息
-
系统服务集成:
• 作为systemd服务运行• 自动重启确保持续监控
• 日志集成到系统日志
这个解决方案完全自动化,部署后无需人工干预,系统会自动处理内存问题并发送预警通知。