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