news 2026/9/25 17:09:38

DevOps-Guide 仓库 Linux 系统管理 Bash 脚本实战:进程监控、僵尸进程清理与文件系统检索全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DevOps-Guide 仓库 Linux 系统管理 Bash 脚本实战:进程监控、僵尸进程清理与文件系统检索全解析
  • 云原生
  • CI/CD
  • 运维

【免费下载链接】DevOps-Guide

DevOps Guide - Development to Production all configurations with basic notes to debug efficiently.

项目地址:https://gitcode.com/gh_mirrors/de/DevOps-Guide
点击查看免费下载

导读

本文以 DevOps-Guide 仓库中的LINUX/bash-scripts-manage-system/目录为对象,完整解析其自带的系统管理 Bash 脚本system-management.sh:这是一个通过select/PS3构建的交互式运维工具,覆盖进程资源监控、超标进程筛选、僵尸进程排查、定向 kill,以及文件系统检索四大场景。读完本文,你将掌握该脚本的每个子功能的底层命令原理(ps排序、awk阈值过滤、find全盘检索),并了解如何在 Linux 主机上直接运行与二次定制这套运维菜单。

脚本总览与快速开始

LINUX/bash-scripts-manage-system/目录下包含两个文件:运行说明文档 README.md 与核心脚本 system-management.sh。README 给出的运行方式非常简单,只有两步:

chmod +x system-management.sh ./system-management.sh

第一条命令为脚本赋予执行权限(chmod +x,可参考 LINUX/Basic_Command 中的权限章节:r=4, w=2, x=1,+x即给所有主体追加执行位);第二条命令直接以./方式执行。脚本本身是纯 Bash 实现,不依赖第三方工具,仅要求目标主机具备ps、awk、find、grep、lsblk、kill等 Linux 标准命令,因此适用于绝大多数主流发行版。

运行后脚本会先执行clear清屏,然后进入主菜单,整体交互流程如下:

  1. 主菜单选择:Manage your Process.(进程管理)/Adding a iptables rule.(iptables 规则,当前为占位)/Managing your filesystem.(文件系统管理)/Quit(退出);
  2. 进入子菜单后通过输入菜单编号执行对应功能;
  3. 每个子菜单内均提供Exit/Quit/Back to the main Menu...选项返回主菜单。

交互式菜单机制:PS3 与 select 解析

整个脚本的交互骨架建立在 Bash 内建命令select与提示符变量PS3之上。select会读取一个单词列表,将其逐行编号打印为菜单,并提示用户输入编号;用户输入的原始内容保存在内建变量$REPLY中,脚本再通过case $REPLY in ... esac分派到对应分支。PS3则用来定制select的提示文本。

主菜单的实现(system-management.sh):

PS3="What do you Want to do: " select fruit in "Manage your Process." "Adding a iptables rule." "Managing your filesystem." "Quit" do case $REPLY in 1) echo "Manage your Process. "; ManageProc ;; 2) echo "Adding a iptables rule. " ;; 3) echo "Managing your filesystem. "; ManagefileSys ;; 4) echo "Quitting "; sleep 1; break ;; *) echo "bad input!!!" ;; esac done

要点说明:

  • 变量名fruit仅用于接收被选中的菜单项文本,真正决定分支走向的是$REPLY(用户键入的数字);
  • 输入超出范围或非数字时落入*)分支,提示bad input!!!并重新显示菜单,实现输入容错;
  • 4)分支通过break跳出select循环,脚本随即结束。

select循环与菜单式运维脚本的搭配在 Bash 中非常常见,读者可结合仓库中的 Bash 脚本基础(含函数、变量、条件表达式、循环等语法)理解其上下文。

彩色输出工具函数 print_style 详解

脚本开头定义了一个全局工具函数print_style(system-management.sh),所有子菜单的输出美化都依赖它:

print_style () { if [ "$2" == "info" ] ; then COLOR="96m"; elif [ "$2" == "success" ] ; then COLOR="92m"; elif [ "$2" == "warning" ] ; then COLOR="93m"; elif [ "$2" == "danger" ] ; then COLOR="91m"; else #default color COLOR="0m"; fi STARTCOLOR="\e[$COLOR"; ENDCOLOR="\e[0m"; printf "$STARTCOLOR%b$ENDCOLOR" "$1"; echo "" }

调用约定为print_style "文本" "风格":$1是待输出的文本,$2是风格关键字。脚本内置四种风格与一种默认风格:

风格关键字ANSI 颜色码显示效果脚本中的典型用途
info96m亮青色(Bright Cyan)提示性说明、进程信息回显
success92m亮绿色(Bright Green)成功结果(本脚本内尚未大量使用)
warning93m亮黄色(Bright Yellow)CPU/内存筛选结果输出
danger91m亮红色(Bright Red)僵尸进程、危险操作警告
其他值0m默认颜色(重置)兜底分支

实现原理是拼接 ANSI 转义序列:\e[<颜色码>作为起始标记、\e[0m作为重置标记,再用printf的%b格式符输出(%b会解释参数中的反斜杠转义序列,从而让\e生效)。该函数在后续所有菜单输出中被复用,是脚本可读性设计的基石。

进程管理模块 ManageProc 深度解析

ManageProc(system-management.sh)是整个脚本中功能最丰富的子模块,进入后clear清屏并提示"This menu facilitates process management...",随后展示一个 7 项菜单:

  1. Top 10 CPU% Usage
  2. Process More Than X CPU Usage(in %)
  3. Top 10 Memory% Usage
  4. Process More X Memory Usage(in %)
  5. Zombie Process
  6. Kill Process
  7. Exit

下面逐一拆解每个分支的命令与原理。

Top 10 CPU 占用(菜单项 1)

ps -ax --sort=-%cpu --format pid,ppid,cmd,%cpu,%mem | head -n 10
  • ps -ax:a显示所有终端上的进程,x额外包含没有控制终端的进程(守护进程等);在 GNUps下-a与a语义等价;
  • --sort=-%cpu:按 CPU 使用率降序排序(负号表示降序),把最耗 CPU 的进程排在最前;
  • --format pid,ppid,cmd,%cpu,%mem:自定义输出列为 PID、PPID、命令行、CPU%、内存%;
  • head -n 10:只保留前 10 行,即 CPU 占用 Top 10。

按阈值筛选高 CPU 进程(菜单项 2)

read -p "Please input your CPU% Usage percentage like 10.0: " threshold ps -ax --format pid,ppid,%cpu,%mem,cmd,user | awk -v threshold=$threshold '{ if ($3 > threshold ) print $0}'
  • read -p交互式读取阈值,示例提示用户输入10.0这类浮点数;
  • --format pid,ppid,%cpu,%mem,cmd,user决定了 awk 的字段布局:$1=pid、$2=ppid、$3=%cpu、$4=%mem、$5=cmd、$6=user;
  • awk -v threshold=$threshold通过-v把 shell 变量注入 awk 环境(避免字符串拼接转义问题);
  • 判断$3 > threshold,即 CPU 列大于阈值的整行print $0输出。

Top 10 内存占用(菜单项 3)

ps ax --sort=-%mem --format pid,ppid,%cpu,%mem,cmd,user | head -n 10

与 Top 10 CPU 的区别仅在于排序键由-%cpu换成-%mem(ps的%mem表示进程驻留内存占系统物理内存的百分比),并按内存降序取前 10。

按阈值筛选高内存进程(菜单项 4)

read -p "Please input your Memory% Usage percentage like: 10.0: " threshold ps -ax --sort=-%mem --format pid,ppid,%cpu,%mem,cmd,user | awk -v threshold=$threshold '{if ($4 > threshold ) print $0}'

字段布局与菜单项 2 相同,但 awk 判断的是$4(即%mem列)是否超过阈值。

僵尸进程排查(菜单项 5)

echo This is Zombie Process, please kill them. ps -ax --format pid,ppid,%cpu,%mem,cmd,stat | awk '$6 == "Z" { print $0 }'
  • 输出列顺序为pid,ppid,%cpu,%mem,cmd,stat,stat(进程状态码)位于最后一列;
  • awk 筛选状态列为Z的行——Z即 Zombie(僵尸进程),表示进程已终止但其父进程尚未调用wait()回收其退出状态;
  • 由于cmd列可能包含空格,字段序号会随之偏移,从脚本结构看,更稳健的写法是使用$NF(最后一个字段)判断stat,例如awk '{if ($NF == "Z") print $0}',读者在定制脚本时可自行调整。

僵尸进程本身已不消耗 CPU/内存,但会占用 PID 表项并长期滞留,通常需从父进程侧处理(或终止其父进程),这也是该分支提示"please kill them"的背景。

定向终止进程(菜单项 6)

read -p "Enter the PID of the process which you want to delete it: " ProcessID ps -ax --sort=-%mem --format pid,ppid,%cpu,%mem,cmd,user | awk -v pid=$ProcessID '{if ($1== pid ) print $0}' read -p "Enter the signal which you want to send it to the process: " signal read -p "Are you sure you want to send this signal to this PID? Y|N " answer case "$answer" in Y|y) print_style "sending signal ($signal) to the PID ($ProcessID) in 5 second, you can press Ctrl+C to cancel it." "danger"; sleep 5 kill -$signal $ProcessID if [[ $? -eq 0 ]] then echo "the pid: $PID is successfully killed." fi ;; N|n) echo "Nothing to do " ;; *) print_style "Bad Input" "danger" ;; esac

该分支体现了"先确认、后执行"的安全流程:

  1. 输入目标 PID 后,先用awk '$1==pid'回显该进程的完整信息,供用户核对(注意$1对应--format输出中的pid列);
  2. 再交互输入要发送的信号编号(如9强制终止、15优雅终止);
  3. 确认Y|y后,脚本以danger风格提示将在 5 秒后发送信号并给出 Ctrl+C 取消机会;
  4. 执行kill -$signal $ProcessID后检查退出码$? -eq 0判断是否成功。

这里有两个值得注意的脚本细节(从源码结构看):其一,成功提示中输出的是$PID而非$ProcessID(system-management.sh),而$PID在该脚本中并未赋值,实际输出为空,正确应改为$ProcessID;其二,kill需要目标进程属于当前用户或具有 root 权限,否则会返回非零退出码。

文件系统管理模块 ManagefileSys 深度解析

ManagefileSys(system-management.sh)提供 4 个文件系统检索功能加 1 个退出项:

  1. List Hard disk
  2. find a file with size
  3. find a file
  4. find a pattern in files in your system
  5. Quit

列出硬盘与文件系统(菜单项 1)

lsblk -f

lsblk -f以树状结构列出系统所有块设备,-f额外显示文件系统类型(如ext4、xfs)、UUID、挂载点等信息,是快速盘点磁盘布局的标准命令。

按大小查找文件(菜单项 2)

read -p "Enter the size in M-Byte: " fileSize find / -type f -size +${fileSize}M -exec ls -lah {} \;
  • find /从根目录递归遍历,-type f限定普通文件;
  • -size +${fileSize}M筛选大于指定兆字节数的文件(+表示大于,M为单位);
  • -exec ls -lah {} \;对每个命中文件执行ls -lah输出可读大小与权限信息,{}是当前文件的占位符,\;终止-exec。

注意:全盘find /需要 root 权限才能完整遍历所有目录,且在大型磁盘上耗时较长;也可将根路径替换为/home、/var等具体目录以缩小范围。

按文件名查找文件(菜单项 3)

read -p "What is the name of the file you are Looking for: " fileName find / -name $fileName

-name按文件名精确匹配(区分大小写)。从脚本结构看,$fileName未加引号,若文件名包含空格会被 shell 拆分导致匹配异常,更稳妥的写法是find / -name "$fileName";如需忽略大小写可改用-iname。

全盘内容检索(菜单项 4)

read -p "Enter the pattern: " pattern find / -type f -name "*" -exec grep -i $pattern {} \;
  • 遍历/下所有普通文件(-name "*"匹配全部文件名);
  • 对每个文件执行grep -i $pattern,-i忽略大小写,输出包含匹配模式的行;
  • 该操作等同于全盘grep -r,开销最大、输出可能极多,建议配合-l(只列文件名)或限制目录范围使用;
  • 同样地,$pattern建议加引号防止含空格的模式被拆分。

主菜单流程与整体控制流

脚本的控制流非常清晰,可归纳为三层结构:

主菜单 (select + PS3) ├─ 1. ManageProc → 进程管理子菜单(7 项) ├─ 2. iptables 规则 → 仅 echo 占位,未实现 ├─ 3. ManagefileSys → 文件系统子菜单(5 项) └─ 4. Quit → break 退出
  • 子菜单内部通过break返回主菜单,主菜单通过break结束脚本;
  • 所有用户输入均通过read -p或select的$REPLY获取;
  • 非法输入统一由*)分支兜底(Bad Input/bad input!!!)。

已知占位与使用注意事项

基于对脚本源码的通读,以下几点对实际使用者最有价值:

  1. iptables 分支尚未实现:主菜单第 2 项Adding a iptables rule.目前只有echo "Adding a iptables rule. "占位(system-management.sh),不会真正添加任何防火墙规则,选择后即返回主菜单;
  2. Kill 成功提示的变量笔误:echo "the pid: $PID is successfully killed."使用了未赋值的$PID,实际应引用$ProcessID;
  3. 权限前提:find /全盘遍历与kill目标进程均可能需要 root 权限,建议以sudo运行或以受限用户运行前评估权限边界;
  4. 引号问题:find / -name $fileName与grep -i $pattern中的变量建议加引号,以兼容含空格的文件名与模式;
  5. 字段偏移:僵尸进程判定用$6匹配stat列,当命令行含空格时会偏移,可改用$NF。

以上均为可验证的源码级观察,读者按需修改即可让脚本在生产环境更稳健。

结合仓库文档的扩展学习路径

本脚本用到的命令与语法在 DevOps-Guide 仓库中有更系统的参考资料,可按需深入:

  • Bash 脚本基础:shebang、变量、read输入、函数定义、条件与循环等语法基础,是理解本脚本print_style/ManageProc/ManagefileSys结构的前提;
  • Shell 脚本速查 与 Shell 脚本编程:shell 概念、select/PS3、常见 shell 差异;
  • 文本处理:awk的字段编号与-v传参、sort的多键排序、grep的检索技巧,本脚本的阈值过滤与排序逻辑均可在此找到系统化讲解;
  • 进程监控 与 性能管理:进程状态、资源监控的补充材料;
  • LINUX/Basic_Command:chmod/chown/管道等基础命令,对应 README 中chmod +x的权限含义;
  • OS 命令 与 OS 概念:Linux 进程模型与系统管理的整体背景。

简言之,LINUX/bash-scripts-manage-system/提供了一个可运行、可改写的交互式系统管理脚本骨架:先按 README 的两条命令直接运行体验,再结合仓库的 Bash 与文本处理文档,把iptables占位补全、修掉$PID笔误、为find/grep参数加引号,即可沉淀为自己的日常运维工具箱。

  • 云原生
  • CI/CD
  • 运维

【免费下载链接】DevOps-Guide

DevOps Guide - Development to Production all configurations with basic notes to debug efficiently.

项目地址:https://gitcode.com/gh_mirrors/de/DevOps-Guide
点击查看免费下载

相关推荐

上一篇:Haystack ChatMessageStore 实验组件详解:用 InMemoryChatMessageStore 管理多会话对话历史
下一篇:OmniRoute Auto-Combo 引擎全解析:16 因子自适应评分、零配置自动路由与自愈模型链

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 17:09:12

红外光谱分析技术应用于乳品检测原理及影响因素

1. 红外光谱分析技术应用于乳品检测原理及影响因素1.1 从一杯牛奶说起&#xff1a;为什么红外光谱能“看透”乳品乳品检测这个行当&#xff0c;说复杂也复杂&#xff0c;说简单也简单。复杂在于牛奶是个极其复杂的胶体体系——里面有水、脂肪、蛋白质、乳糖、矿物质&#xff0c…

作者头像 李华
网站建设 2026/9/25 17:04:01

工业控制系统入侵检测:LSTM+GNN混合模型实战指南

1. 项目概述&#xff1a;这不是又一个“AI安全”的空泛口号&#xff0c;而是工业现场真刀真枪的检测落地“ICSISIA智库 | 尚文利&#xff1a;基于人工智能的工业控制系统入侵检测算法研究及展望&#xff08;附PPT全文&#xff09;”——这个标题里藏着三个关键锚点&#xff1a;…

作者头像 李华
网站建设 2026/9/25 17:02:55

MiniMax H3-free免费额度实测:每天10条AI视频生成的高效利用指南

最近我在折腾AI视频生成的时候&#xff0c;发现MiniMax H3-free这个免费档位已经可以稳定白嫖了&#xff1a;每天10条生成额度&#xff0c;单条5到15秒&#xff0c;对日常做创意测试、跑短视频demo&#xff0c;甚至给账号稳定供稿来说&#xff0c;这个额度其实非常够用。关键是…

作者头像 李华
网站建设 2026/9/25 17:02:24

如何完成PaiAgent生产部署:JWT认证、环境变量与敏感配置完全指南

如何完成PaiAgent生产部署&#xff1a;JWT认证、环境变量与敏感配置完全指南 【免费下载链接】PaiAgent &#x1f525;轻量级的AI工作流编排系统&#xff0c;类似dify、n8n&#xff0c;全程使用Vibe Coding&#xff0c;AI工具为QoderCLI。涉及到的技术栈包括SpringAI、LangGrap…

作者头像 李华
网站建设 2026/9/25 16:58:22

ORDL医疗数据解析实战:从黑匣子到CDR的逆向工程

简介&#xff1a;本资源是一份面向机器学习与信号处理方向研究者及MATLAB开发者的在线词典学习&#xff08;ORDL&#xff09;算法实践代码包&#xff0c;聚焦大规模流式数据下的稀疏表示建模问题&#xff0c;适用于文本分类、图像去噪、高维信号压缩等典型场景。压缩包为RAR格式…

作者头像 李华