DZ插件网目前在用的手工扛攻击在高内存占用和高负载在系统资源超载尝试安全重启服务无果的情况下自动执行系统重启恢复访问服务
2025/09/01 20:35:53
DZ插件网目前在用的手工扛攻击在高内存占用和高负载在系统资源超载尝试安全重启服务无果的情况下自动执行系统重启恢复访问服务的脚本方案:
创建脚本文件::
复制DZ插件网优化后的脚本内容粘贴进去:
设置脚本权限并创建日志文件:
将其配置为系统服务:
将以下内容写入服务文件:
启动并启用服务:
检查服务状态:
[此处包含隐藏内容,如果需要查看请回复]
创建脚本文件::
- sudo vi /usr/local/bin/auto_restart_monitor.sh
- #!/bin/bash
- # 高级内存和负载监控重启脚本
- # 警告:使用此脚本意味着您接受重启带来的服务中断风险。
- # ===== 配置区域 =====
- # 内存使用率阈值(%),超过此值将触发操作
- MEM_THRESHOLD=65
- # 1分钟平均负载阈值,超过此值将触发操作(通常为CPU核心数乘以1.5-2)
- LOAD_THRESHOLD=$(($(nproc) * 2))
- # 检查间隔(秒)
- CHECK_INTERVAL=60
- # 日志文件路径
- LOG_FILE="/var/log/auto_restart_monitor.log"
- # 最大日志文件大小(KB),超过则滚动
- MAX_LOG_SIZE=10240
- # ===== 函数:记录日志 =====
- log_message() {
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
- }
- # ===== 函数:清理大日志 =====
- rotate_log_if_needed() {
- if [ -f "$LOG_FILE" ] && [ $(du -k "$LOG_FILE" | cut -f1) -ge $MAX_LOG_SIZE ]; then
- mv "$LOG_FILE" "${LOG_FILE}.old"
- touch "$LOG_FILE"
- log_message "日志文件已滚动"
- fi
- }
- # ===== 函数:安全重启程序 =====
- safe_restart() {
- log_message "警告!系统资源超额,正在尝试安全重启服务..."
- # 1. 尝试优雅地重启Web服务(避免强制kill)
- systemctl restart nginx 2>> "$LOG_FILE"
- systemctl restart php-fpm74 2>> "$LOG_FILE" # 请根据您的PHP版本调整
- # 等待一段时间让服务重启完成
- sleep 30
- # 2. 再次检查资源状态
- local MEM_USAGE=$(free | awk '/Mem:/ {printf("%.0f"), $3/$2 * 100}')
- local LOAD=$(awk '{print $1}' /proc/loadavg | cut -d. -f1)
- if [ "$MEM_USAGE" -ge "$MEM_THRESHOLD" ] || [ "$LOAD" -ge "$LOAD_THRESHOLD" ]; then
- log_message "服务重启后资源仍然紧张,即将执行系统重启..."
- # 在执行重启前最后记录一次
- sync
- # 发送重启广播(如果有多用户)
- wall "系统将于60秒后由于高内存负载自动重启,请保存您的工作。"
- sleep 60
- # 最终执行重启
- log_message "开始执行系统重启..."
- reboot
- else
- log_message "服务重启后系统资源已恢复正常,取消系统重启。"
- fi
- }
- # ===== 主循环 =====
- log_message "自动监控脚本启动。配置:内存阈值=${MEM_THRESHOLD}%,负载阈值=${LOAD_THRESHOLD},检查间隔=${CHECK_INTERVAL}秒。"
- while true; do
- # 日志滚动检查
- rotate_log_if_needed
- # 获取当前系统指标
- MEM_USAGE=$(free | awk '/Mem:/ {printf("%.0f"), $3/$2 * 100}')
- LOAD=$(awk '{print $1}' /proc/loadavg | cut -d. -f1)
- # 调试信息(可选,注释掉以免日志过大)
- # log_message "调试 - 内存使用率: $MEM_USAGE%, 1分钟负载: $LOAD"
- # 检查条件:内存使用率OR系统负载超过阈值
- if [ "$MEM_USAGE" -ge "$MEM_THRESHOLD" ] || [ "$LOAD" -ge "$LOAD_THRESHOLD" ]; then
- log_message "警报!资源超额:内存=${MEM_USAGE}%,负载=${LOAD}。触发处理流程。"
- safe_restart
- fi
- sleep $CHECK_INTERVAL
- done
- sudo chmod +x /usr/local/bin/auto_restart_monitor.sh
- sudo touch /var/log/auto_restart_monitor.log
- sudo chmod 644 /var/log/auto_restart_monitor.log
- sudo vi /etc/systemd/system/auto-restart-monitor.service
- [Unit]
- Description=Auto Restart Monitor Service
- After=network.target
- [Service]
- Type=simple
- ExecStart=/bin/bash /usr/local/bin/auto_restart_monitor.sh
- Restart=always
- RestartSec=10
- User=root
- [Install]
- WantedBy=multi-user.target
- sudo systemctl daemon-reload
- sudo systemctl enable auto-restart-monitor.service
- sudo systemctl start auto-restart-monitor.service
- sudo systemctl status auto-restart-monitor.service
- # 查看监控日志
- tail -f /var/log/auto_restart_monitor.log