服务器防止宕机

该脚本 protect.sh 是一款面向 Linux 系统的主动式资源保护工具,核心目标是通过"预留核心资源+限制非核心进程+扩容缓冲空间"的组合策略,避免系统因内存、CPU、磁盘 IO 耗尽而宕机,适配 Debian/Ubuntu(apt 包管理器)和 CentOS/RHEL(yum/dnf 包管理器)系列系统,最终通过 systemd 服务实现规则持久化,弥补 Linux 内核默认机制的局限性。

bash 复制代码
bash <(curl -s https://help.api.afmax.cn/linux/safe/protect.sh)

一、核心功能总览

脚本通过 8 个关键步骤实现精细化资源管控,核心围绕"保障系统核心运行+约束非核心进程"展开,最终实现开机自启的自动化保护:

  1. 自动适配系统包管理器(apt/yum/dnf),无需手动切换命令;
  2. 检测并扩容 SWAP 分区(确保最低 800MB),提供内存溢出缓冲;
  3. 按物理内存规格动态预留核心内存,避免系统基础进程被抢占;
  4. 限制非核心进程的 CPU 使用率和磁盘 IO 权重,防止资源滥用;
  5. 安装依赖工具并创建 systemd 服务,确保保护规则持久生效。

二、详细功能拆解

1. 系统环境智能适配

脚本开篇自动检测系统包管理器,匹配对应操作逻辑,降低跨系统使用门槛:

  • 检测到 apt-get → 判定为 Debian/Ubuntu 系,使用 apt 包管理;
  • 检测到 dnf → 判定为 RHEL 8+/CentOS 8+ 系,使用 dnf 包管理;
  • 检测到 yum → 判定为 RHEL 7-/CentOS 7- 系,使用 yum 包管理;
  • 无上述包管理器则直接退出,避免无效执行。

2. 内存规格检测与动态规则匹配(后期可能会进一步调优)

通过读取 /proc/meminfo 获取系统总物理内存,按内存大小差异化设定管控规则(核心参数如下表),实现"内存越小,保护越严格"的逻辑:

系统总内存 预留核心内存 SWAP 配置 非核心进程 CPU 限制 非核心进程 IO 限制
≤ 512MB 64MB 扩容到≥800MB ≤10% ≤20%
512MB-1GB 80MB 扩容到≥800MB ≤8% ≤20%
1GB-2GB 100MB 扩容到≥800MB ≤5% ≤15%
2GB-4GB 200MB 扩容到≥800MB ≤5% ≤10%
4GB-6GB 300MB 扩容到≥800MB ≤4% ≤9%
6GB-8GB 300MB 扩容到≥800MB ≤3% ≤8%
>8GB 300MB 扩容到≥800MB ≤2% ≤5%

3. 依赖工具安装

根据包管理器类型,安装资源管控必需的工具:

  • Debian/Ubuntu 系:安装 cgroup-tools(cgroup 控制组工具)、util-linux(系统基础工具集);
  • RHEL/CentOS 系:安装 libcgroup-tools(红帽系 cgroup 工具包)、util-linux

4. SWAP 分区扩容(内存溢出兜底)

SWAP 作为"临时内存",是避免内存耗尽的关键缓冲,脚本强制保障其最低容量≥800MB:

  • 通过 free -k 检测当前 SWAP 总容量;
  • 若不足 800MB,计算缺失容量并创建 /swap_protect 交换文件(按缺失大小生成);
  • 配置文件权限(600,仅 root 可读写)、格式化并启用;
  • 写入 /etc/fstab,确保系统重启后自动挂载,实现持久化缓冲。

5. cgroup 核心资源管控(主动限制逻辑)

通过 Linux cgroup(控制组)功能,创建名为 system_protect 的控制组,实现"核心资源预留+非核心进程约束":

  • 内存预留 :通过 memory.limit_in_bytes 设定预留内存,保障系统内核、SSH 等核心进程的内存需求,避免被非核心进程抢占;
  • CPU 限制 :通过 cpu.shares 设定非核心进程的 CPU 权重(1024=100% 权重),例如 CPU 限制为 5% 时,权重=(100-5)×1024=97152,权重越低,可抢占的 CPU 资源越少;
  • 磁盘 IO 限制 :通过 blkio.weight 设定非核心进程的 IO 权重(范围 100~1000),例如 IO 限制为 10% 时,权重=1000 -(10×10)=900,降低非核心进程的 IO 优先级,避免磁盘 IO 占满导致系统卡顿。

6. systemd 服务持久化

创建 protect-cgroup.service 系统服务,确保保护规则开机自启、异常重启后自动恢复:

  • 服务路径:/etc/systemd/system/protect-cgroup.service
  • 启动逻辑(ExecStart):创建 cgroup 并应用内存、CPU、IO 限制;
  • 停止逻辑(ExecStop):删除 cgroup 控制组,释放限制;
  • 启用方式:通过 systemctl daemon-reload 重载配置,systemctl enable --now 实现"立即启用+开机自启"。

三、适用场景与核心价值

适用场景

  • 低配置服务器(如 1GB/2GB 内存的云服务器、物理机);
  • 运行高资源占用进程(如数据库、爬虫、服务端程序)的系统;
  • 需保障核心服务(如 SSH、系统内核、关键业务进程)稳定运行的场景。

核心价值

  1. 自动化适配:跨系统自动匹配包管理器和依赖,无需手动配置;
  2. 资源兜底:SWAP 扩容避免内存溢出,核心内存预留保障系统基础运行;
  3. 精细化限制:仅约束非核心进程,不影响核心服务的性能;
  4. 持久化生效:通过 systemd 服务实现开机自启,无需重复操作;
  5. 可观测性 :支持通过 lscgroup(查看控制组)、cgget(查看控制组参数)验证配置生效状态。

四、补充:为什么 Linux 服务器宕机后无法自恢复?

脚本的核心意义,本质是弥补 Linux 内核默认资源机制的"被动性"------内核虽有基础保护,但无法实现"主动保障系统稳定",这也是宕机后需手动重启的核心原因:

  1. 内核保护是"被动底线级":仅当系统濒临崩溃时(如内存耗尽),才会触发 OOM Killer(内存不足杀手),通过选择性杀死高资源占用进程保系统,但这个过程不可控,可能误杀核心服务(如数据库、SSH),导致系统虽未彻底崩溃但无法正常使用,仍需重启恢复;
  2. 优先级调度需"主动配置":内核默认所有进程优先级相近,核心服务(如内核、业务程序)与非核心服务(如临时脚本、后台进程)公平竞争资源,无自动优先权,若不主动配置(如脚本的 cgroup 规则),核心服务易被抢占资源而宕机;
  3. 无法处理应用层异常:对于内存泄漏、进程死锁等应用层问题,内核无法识别和修复,只能任由其持续消耗资源,最终导致系统卡顿或宕机,而宕机后这类异常进程仍占用资源,需重启释放。

简单说,Linux 内核只负责"不轻易让系统彻底垮掉",而"让核心服务稳定拿到足够资源、避免异常进程拖垮系统",需要脚本这类主动配置的资源策略来实现。

五、使用注意事项

  1. 脚本需以 root 权限执行(涉及系统资源配置、服务创建、文件写入);
  2. 执行前会显示操作明细,需输入 Y 确认后才继续,避免误操作;
  3. 提醒:sh脚本是高危操作,请注意来源是否正规
  4. 安全告知与条款:https://files.api.afmax.cn/1761393065014/https://files.api.afmax.cn/yong-hu-tiao-kuan
相关推荐
LucianaiB2 小时前
【基于昇腾平台的CodeLlama实践:从环境搭建到高效开发】
运维·人工智能·性能优化
运维行者_2 小时前
网络流量分析入门:从流量监控与 netflow 看懂核心作用
运维·开发语言·网络·云原生·容器·kubernetes·php
wangyongpro2 小时前
Ubuntu 系统盘拓展分区空间大小
linux·运维·ubuntu
熊猫钓鱼>_>2 小时前
解决Web游戏Canvas内容在服务器部署时的显示问题
服务器·前端·游戏·canvas·cors·静态部署·资源路径
代码游侠2 小时前
应用——Linux FIFO(命名管道)与I/O多路复用
linux·运维·服务器·网络·笔记·学习
无奈笑天下2 小时前
麒麟V10SP1虚拟机安装vmtool-参考教程
linux·运维·服务器·个人开发
郝学胜-神的一滴2 小时前
Linux多线程编程:深入理解pthread_cancel函数
linux·服务器·开发语言·c++·软件工程
代码游侠2 小时前
复习——网络编程基础
linux·服务器·网络·笔记·网络协议
Trouvaille ~2 小时前
【C++篇】让错误被温柔对待(下):异常高级特性与最佳实践
运维·开发语言·c++·异常·raii·编程实践·基础入门