去评论
dz插件网

DZ插件网目前在用的手工扛攻击在高内存占用和高负载在系统资源超载尝试安全重启服务无果的情况下自动执行系统重启恢复访问服务

admin
2025/09/01 20:35:53
DZ插件网目前在用的手工扛攻击在高内存占用和高负载在系统资源超载尝试安全重启服务无果的情况下自动执行系统重启恢复访问服务的脚本方案:

创建脚本文件::
  1. sudo vi /usr/local/bin/auto_restart_monitor.sh
复制DZ插件网优化后的脚本内容粘贴进去:
  1. #!/bin/bash

  2. # 高级内存和负载监控重启脚本
  3. # 警告:使用此脚本意味着您接受重启带来的服务中断风险。

  4. # ===== 配置区域 =====
  5. # 内存使用率阈值(%),超过此值将触发操作
  6. MEM_THRESHOLD=65
  7. # 1分钟平均负载阈值,超过此值将触发操作(通常为CPU核心数乘以1.5-2)
  8. LOAD_THRESHOLD=$(($(nproc) * 2))
  9. # 检查间隔(秒)
  10. CHECK_INTERVAL=60
  11. # 日志文件路径
  12. LOG_FILE="/var/log/auto_restart_monitor.log"
  13. # 最大日志文件大小(KB),超过则滚动
  14. MAX_LOG_SIZE=10240

  15. # ===== 函数:记录日志 =====
  16. log_message() {
  17.     echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
  18. }

  19. # ===== 函数:清理大日志 =====
  20. rotate_log_if_needed() {
  21.     if [ -f "$LOG_FILE" ] && [ $(du -k "$LOG_FILE" | cut -f1) -ge $MAX_LOG_SIZE ]; then
  22.         mv "$LOG_FILE" "${LOG_FILE}.old"
  23.         touch "$LOG_FILE"
  24.         log_message "日志文件已滚动"
  25.     fi
  26. }

  27. # ===== 函数:安全重启程序 =====
  28. safe_restart() {
  29.     log_message "警告!系统资源超额,正在尝试安全重启服务..."
  30.     # 1. 尝试优雅地重启Web服务(避免强制kill)
  31.     systemctl restart nginx 2>> "$LOG_FILE"
  32.     systemctl restart php-fpm74 2>> "$LOG_FILE" # 请根据您的PHP版本调整

  33.     # 等待一段时间让服务重启完成
  34.     sleep 30

  35.     # 2. 再次检查资源状态
  36.     local MEM_USAGE=$(free | awk '/Mem:/ {printf("%.0f"), $3/$2 * 100}')
  37.     local LOAD=$(awk '{print $1}' /proc/loadavg | cut -d. -f1)

  38.     if [ "$MEM_USAGE" -ge "$MEM_THRESHOLD" ] || [ "$LOAD" -ge "$LOAD_THRESHOLD" ]; then
  39.         log_message "服务重启后资源仍然紧张,即将执行系统重启..."
  40.         # 在执行重启前最后记录一次
  41.         sync
  42.         # 发送重启广播(如果有多用户)
  43.         wall "系统将于60秒后由于高内存负载自动重启,请保存您的工作。"
  44.         sleep 60
  45.         # 最终执行重启
  46.         log_message "开始执行系统重启..."
  47.         reboot
  48.     else
  49.         log_message "服务重启后系统资源已恢复正常,取消系统重启。"
  50.     fi
  51. }

  52. # ===== 主循环 =====
  53. log_message "自动监控脚本启动。配置:内存阈值=${MEM_THRESHOLD}%,负载阈值=${LOAD_THRESHOLD},检查间隔=${CHECK_INTERVAL}秒。"

  54. while true; do
  55.     # 日志滚动检查
  56.     rotate_log_if_needed

  57.     # 获取当前系统指标
  58.     MEM_USAGE=$(free | awk '/Mem:/ {printf("%.0f"), $3/$2 * 100}')
  59.     LOAD=$(awk '{print $1}' /proc/loadavg | cut -d. -f1)

  60.     # 调试信息(可选,注释掉以免日志过大)
  61.     # log_message "调试 - 内存使用率: $MEM_USAGE%, 1分钟负载: $LOAD"

  62.     # 检查条件:内存使用率OR系统负载超过阈值
  63.     if [ "$MEM_USAGE" -ge "$MEM_THRESHOLD" ] || [ "$LOAD" -ge "$LOAD_THRESHOLD" ]; then
  64.         log_message "警报!资源超额:内存=${MEM_USAGE}%,负载=${LOAD}。触发处理流程。"
  65.         safe_restart
  66.     fi

  67.     sleep $CHECK_INTERVAL
  68. done
设置脚本权限并创建日志文件

  1. sudo chmod +x /usr/local/bin/auto_restart_monitor.sh
  2. sudo touch /var/log/auto_restart_monitor.log
  3. sudo chmod 644 /var/log/auto_restart_monitor.log
将其配置为系统服务

  1. sudo vi /etc/systemd/system/auto-restart-monitor.service
将以下内容写入服务文件

  1. [Unit]
  2. Description=Auto Restart Monitor Service
  3. After=network.target

  4. [Service]
  5. Type=simple
  6. ExecStart=/bin/bash /usr/local/bin/auto_restart_monitor.sh
  7. Restart=always
  8. RestartSec=10
  9. User=root

  10. [Install]
  11. WantedBy=multi-user.target
启动并启用服务

  1. sudo systemctl daemon-reload
  2. sudo systemctl enable auto-restart-monitor.service
  3. sudo systemctl start auto-restart-monitor.service
检查服务状态

  1. sudo systemctl status auto-restart-monitor.service
  2. # 查看监控日志
  3. tail -f /var/log/auto_restart_monitor.log
[此处包含隐藏内容,如果需要查看请回复]