当前位置: 首页 > news >正文

Linux 系统资源负载控制脚本:CPU 内存一键管理(后台常驻版)

在日常性能测试、故障演练或容量评估中,我们经常需要人为地制造 CPU 或内存压力。本文将分享一个交互式、后台常驻的 Bash 脚本,支持:

  • 30% / 40% / 50% / 60% / 80% / 100% 六档 CPU 负载
  • 30% / 40% / 50% / 60% / 80% / 95% 六档内存占用
  • 退出脚本后负载继续生效,重新运行脚本可随时调整或停止
  • CPU 与内存控制完全解耦,互不影响

一、脚本功能速览

功能快捷键说明
CPU 负载控制1 → 30~99按需生成 dd 进程
内存负载控制2 → 30~99在 /dev/shm 创建临时文件
停止所有负载3一键清理 CPU & 内存
退出脚本0负载仍保持运行
查看实时状态主菜单顶部显示当前百分比 + PID

二、脚本代码

将以下内容保存为 resource_controller.shchmod +x 后即可使用。

#!/bin/bash
# ------------------------------------------------------------
# Linux 资源负载控制器 - 后台常驻版
# Author:  <your-name>
# ------------------------------------------------------------
PID_DIR="/tmp/resource_pids"
mkdir -p "$PID_DIR"# ---------- 菜单 ----------
show_menu() {clearecho "========================================="echo "  Linux 资源负载控制中心 (后台常驻版)"echo "========================================="echo "1. CPU负载控制"echo "2. 内存负载控制"echo "3. 停止所有负载"echo "0. 退出脚本"echo "========================================="echo "[当前状态]"check_cpu_statuscheck_mem_statusecho "========================================="read -p "请选择操作 [0-3]: " main_choice
}cpu_menu() {echo "-----------------------------------------"echo "CPU 负载级别"echo "30  40  50  60  80  99(100%)"echo "0  停止  b 返回"read -p "级别: " cpu_choice
}mem_menu() {echo "-----------------------------------------"echo "内存 负载级别"echo "30  40  50  60  80  99(95%)"echo "0  停止  b 返回"read -p "级别: " mem_choice
}# ---------- 状态检查 ----------
check_cpu_status() {[[ -f "$PID_DIR/cpu.pid" ]] && ps -p $(<"$PID_DIR/cpu.pid") &>/dev/null \&& echo "CPU负载: 运行中 ($(ps -o cmd= -p $(<"$PID_DIR/cpu.pid") | awk -F'=' '{print $2}')%)" \|| echo "CPU负载: 未运行"
}check_mem_status() {[[ -f "$PID_DIR/mem.pid" ]] && ps -p $(<"$PID_DIR/mem.pid") &>/dev/null \&& echo "内存负载: 运行中" \|| echo "内存负载: 未运行"
}# ---------- 停止 ----------
stop_cpu_load() {[[ -f "$PID_DIR/cpu.pid" ]] && kill -9 $(<"$PID_DIR/cpu.pid") 2>/dev/nullrm -f "$PID_DIR/cpu.pid"pkill -f 'dd if=/dev/zero of=/dev/null' 2>/dev/null
}stop_mem_load() {[[ -f "$PID_DIR/mem.pid" ]] && kill -9 $(<"$PID_DIR/mem.pid") 2>/dev/nullrm -f "$PID_DIR/mem.pid"pkill -f 'dd if=/dev/zero of=/dev/shm/memload_' 2>/dev/nullrm -f /dev/shm/memload_*sync && echo 3 > /proc/sys/vm/drop_caches 2>/dev/null
}stop_all_load() {stop_cpu_loadstop_mem_loadecho "✅ 已停止所有负载"sleep 1
}# ---------- CPU ----------
start_cpu_load() {percent=$1core_count=$(nproc)count=$(( (core_count * percent + 5) / 10 ))stop_cpu_loadcat > /tmp/start_cpu_daemon.sh <<EOF
#!/bin/bash
echo \$\$ > "$PID_DIR/cpu.pid"
for ((i=0;i<$count;i++)); do dd if=/dev/zero of=/dev/null status=none & done
sleep infinity
EOFchmod +x /tmp/start_cpu_daemon.shnohup /tmp/start_cpu_daemon.sh >/dev/null 2>&1 &echo "✅ CPU负载${percent}%已启动 (${count}进程)"
}# ---------- 内存 ----------
start_mem_load() {percent=$1total_mb=$(( $(grep MemTotal /proc/meminfo | awk '{print $2}') / 1024 ))[[ $percent -eq 99 ]] && target=95 || target=$percenttarget_mb=$(( total_mb * target / 100 - 100 ))[[ $target_mb -lt 100 ]] && target_mb=100blocks=$((target_mb / 100))remainder=$((target_mb % 100))stop_mem_loadcat > /tmp/start_mem_daemon.sh <<EOF
#!/bin/bash
echo \$\$ > "$PID_DIR/mem.pid"
for ((i=1;i<=$blocks;i++)); do dd if=/dev/zero of=/dev/shm/memload_\${i}_\$\$ bs=100M count=1 status=none; done
[[ $remainder -gt 0 ]] && dd if=/dev/zero of=/dev/shm/memload_last_\$\$ bs=${remainder}M count=1 status=none
sleep infinity
EOFchmod +x /tmp/start_mem_daemon.shnohup /tmp/start_mem_daemon.sh >/dev/null 2>&1 &echo "✅ 内存负载${target}%已启动 (${target_mb}MB)"
}# ---------- 主循环 ----------
while true; doshow_menucase $main_choice in1)while true; docpu_menucase $cpu_choice in30|40|50|60|80|99) start_cpu_load $cpu_choice ;;0) stop_cpu_load ;;b|B) break ;;*) echo "无效选择"; sleep 1 ;;esacdone ;;2)while true; domem_menucase $mem_choice in30|40|50|60|80|99) start_mem_load $mem_choice ;;0) stop_mem_load ;;b|B) break ;;*) echo "无效选择"; sleep 1 ;;esacdone ;;3) stop_all_load ;;0) echo "脚本已退出,负载仍在后台"; exit 0 ;;*) echo "无效选择"; sleep 1 ;;esac
done

三、快速上手

  1. 赋权 & 启动
   chmod +x resource_controller.sh./resource_controller.sh
  1. 操作示例

    • 主菜单选 1 → 60 → CPU 负载 60% 立即生效
    • 主菜单选 2 → 80 → 内存占用 80% 立即生效
    • 选 0 退出脚本,负载不会停止
    • 再次运行脚本可查看/调整/停止
  2. 验证效果

   top -1         # 查看 CPU 占用free -m        # 查看内存占用ls /dev/shm    # 查看内存文件

四、技术要点

技术用途
nohup + sleep infinity实现后台常驻
/dev/shm 内存文件系统制造内存占用不占用磁盘
PID_DIR 保存进程号精确管理,避免误杀
dd if=/dev/zero简单可靠的负载生成器
drop_caches清理页缓存,立即释放内存

五、常见问题

  1. 脚本退出后负载消失? 确保使用 nohup 启动守护进程(已内置)。

  2. 需要 root 吗? 普通用户即可,但 drop_caches 需 root,无 root 时会自动跳过。

  3. 如何彻底清理? 重新运行脚本 → 选择 3 停止所有负载,或手动 pkill dd 并删除 /dev/shm/memload_*

六、扩展思路

  • 定时任务:配合 cron 做周期性压测
  • 远程触发:通过 ssh 调用脚本做分布式压测
  • 监控集成:将负载百分比写入 Prometheus 指标
  • 容器化:打包成镜像在 K8s 中做 Chaos 工程

文章转载自:

http://iremecnm.gmrxh.cn
http://ChRNEnsi.gmrxh.cn
http://eC58DWrq.gmrxh.cn
http://qO9sbKK4.gmrxh.cn
http://YgLTwFIq.gmrxh.cn
http://znTE0n5T.gmrxh.cn
http://Rbb8LIjl.gmrxh.cn
http://28XyUQsv.gmrxh.cn
http://XiKMaFbq.gmrxh.cn
http://t2PvHZqB.gmrxh.cn
http://WgcCgEqx.gmrxh.cn
http://KPDMvKO7.gmrxh.cn
http://L3LPnqoo.gmrxh.cn
http://q2JctTTM.gmrxh.cn
http://rcbX9u2e.gmrxh.cn
http://Y5Dz8gh2.gmrxh.cn
http://WytMlWi6.gmrxh.cn
http://MU9p2QcL.gmrxh.cn
http://Vu7HDFNC.gmrxh.cn
http://tc5MRYWG.gmrxh.cn
http://rh9hBIbH.gmrxh.cn
http://9LRVyvC7.gmrxh.cn
http://8jlHMCjk.gmrxh.cn
http://BjCXRxa6.gmrxh.cn
http://ecx0iZf7.gmrxh.cn
http://LjdOIEhK.gmrxh.cn
http://cKznyyol.gmrxh.cn
http://MX8wcGwZ.gmrxh.cn
http://bQie2N8X.gmrxh.cn
http://X07eZcmW.gmrxh.cn
http://www.dtcms.com/a/379486.html

相关文章:

  • rook-ceph登录报错Invalid credentials
  • 《RocketMQ核心架构与实战解析》
  • C语言---常量
  • 豆包・图像创作模型 Seedream 4.0 正式发布!
  • OCSP(Online Certificate Status Protocol,在线证书状态协议)
  • 深度学习(六):代价函数的意义
  • 【lite.ai.toolkit】【深度学习】【Ubuntu 20.04】C++ 轻量级AI模型工具箱的编译、安装、使用教程
  • 远程创意协作新方式:cpolar助力Drawnix跨地域团队协作
  • 深入理解 Linux 内核进程管理
  • 企业跨区域组网新解:SD-WAN技术打造安全稳定网络体系
  • 单身杯2 web
  • 《Learning Langchain》阅读笔记12-RAG(8):RAG的优化策略
  • daily notes[43]
  • LRU缓存详解:用C语言实现高效数据管理
  • 灵码产品演示:软件工程架构分析
  • 硬件电路-陀机
  • swiper插件的使用
  • mysql的各种锁
  • Java大厂面试实录:AIGC与虚拟互动场景下的微服务与AI落地(附知识详解)
  • Kafka 学习笔记
  • 机械零件极限应力线图
  • 萤石安全生产监管解决方案:构建企业安全智能化防护网
  • sqlmap常用命令
  • MID认证:全球电力计量市场的通行证与中国协议兼容性分析
  • STM32开发(USART:IIC总线)
  • Spring框架中用到的设计模式
  • 从源码和设计模式深挖AQS(AbstractQueuedSynchronizer)
  • 四、计算机网络与分布式系统(中)
  • 半导体学习笔记
  • 深入解析Dart虚拟机运行原理