该脚本 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 个关键步骤实现精细化资源管控,核心围绕"保障系统核心运行+约束非核心进程"展开,最终实现开机自启的自动化保护:
- 自动适配系统包管理器(apt/yum/dnf),无需手动切换命令;
- 检测并扩容 SWAP 分区(确保最低 800MB),提供内存溢出缓冲;
- 按物理内存规格动态预留核心内存,避免系统基础进程被抢占;
- 限制非核心进程的 CPU 使用率和磁盘 IO 权重,防止资源滥用;
- 安装依赖工具并创建 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、系统内核、关键业务进程)稳定运行的场景。
核心价值
- 自动化适配:跨系统自动匹配包管理器和依赖,无需手动配置;
- 资源兜底:SWAP 扩容避免内存溢出,核心内存预留保障系统基础运行;
- 精细化限制:仅约束非核心进程,不影响核心服务的性能;
- 持久化生效:通过 systemd 服务实现开机自启,无需重复操作;
- 可观测性 :支持通过
lscgroup(查看控制组)、cgget(查看控制组参数)验证配置生效状态。
四、补充:为什么 Linux 服务器宕机后无法自恢复?
脚本的核心意义,本质是弥补 Linux 内核默认资源机制的"被动性"------内核虽有基础保护,但无法实现"主动保障系统稳定",这也是宕机后需手动重启的核心原因:
- 内核保护是"被动底线级":仅当系统濒临崩溃时(如内存耗尽),才会触发 OOM Killer(内存不足杀手),通过选择性杀死高资源占用进程保系统,但这个过程不可控,可能误杀核心服务(如数据库、SSH),导致系统虽未彻底崩溃但无法正常使用,仍需重启恢复;
- 优先级调度需"主动配置":内核默认所有进程优先级相近,核心服务(如内核、业务程序)与非核心服务(如临时脚本、后台进程)公平竞争资源,无自动优先权,若不主动配置(如脚本的 cgroup 规则),核心服务易被抢占资源而宕机;
- 无法处理应用层异常:对于内存泄漏、进程死锁等应用层问题,内核无法识别和修复,只能任由其持续消耗资源,最终导致系统卡顿或宕机,而宕机后这类异常进程仍占用资源,需重启释放。
简单说,Linux 内核只负责"不轻易让系统彻底垮掉",而"让核心服务稳定拿到足够资源、避免异常进程拖垮系统",需要脚本这类主动配置的资源策略来实现。
五、使用注意事项
- 脚本需以
root权限执行(涉及系统资源配置、服务创建、文件写入); - 执行前会显示操作明细,需输入
Y确认后才继续,避免误操作; - 提醒:sh脚本是高危操作,请注意来源是否正规
- 安全告知与条款:https://files.api.afmax.cn/1761393065014/https://files.api.afmax.cn/yong-hu-tiao-kuan