- 云原生
- CI/CD
- 运维
【免费下载链接】DevOps-Guide
DevOps Guide - Development to Production all configurations with basic notes to debug efficiently.
导读
本文以 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清屏,然后进入主菜单,整体交互流程如下:
- 主菜单选择:
Manage your Process.(进程管理)/Adding a iptables rule.(iptables 规则,当前为占位)/Managing your filesystem.(文件系统管理)/Quit(退出); - 进入子菜单后通过输入菜单编号执行对应功能;
- 每个子菜单内均提供
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 颜色码 | 显示效果 | 脚本中的典型用途 |
|---|---|---|---|
info | 96m | 亮青色(Bright Cyan) | 提示性说明、进程信息回显 |
success | 92m | 亮绿色(Bright Green) | 成功结果(本脚本内尚未大量使用) |
warning | 93m | 亮黄色(Bright Yellow) | CPU/内存筛选结果输出 |
danger | 91m | 亮红色(Bright Red) | 僵尸进程、危险操作警告 |
| 其他值 | 0m | 默认颜色(重置) | 兜底分支 |
实现原理是拼接 ANSI 转义序列:\e[<颜色码>作为起始标记、\e[0m作为重置标记,再用printf的%b格式符输出(%b会解释参数中的反斜杠转义序列,从而让\e生效)。该函数在后续所有菜单输出中被复用,是脚本可读性设计的基石。
进程管理模块 ManageProc 深度解析
ManageProc(system-management.sh)是整个脚本中功能最丰富的子模块,进入后clear清屏并提示"This menu facilitates process management...",随后展示一个 7 项菜单:
- Top 10 CPU% Usage
- Process More Than X CPU Usage(in %)
- Top 10 Memory% Usage
- Process More X Memory Usage(in %)
- Zombie Process
- Kill Process
- Exit
下面逐一拆解每个分支的命令与原理。
Top 10 CPU 占用(菜单项 1)
ps -ax --sort=-%cpu --format pid,ppid,cmd,%cpu,%mem | head -n 10ps -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该分支体现了"先确认、后执行"的安全流程:
- 输入目标 PID 后,先用
awk '$1==pid'回显该进程的完整信息,供用户核对(注意$1对应--format输出中的pid列); - 再交互输入要发送的信号编号(如
9强制终止、15优雅终止); - 确认
Y|y后,脚本以danger风格提示将在 5 秒后发送信号并给出 Ctrl+C 取消机会; - 执行
kill -$signal $ProcessID后检查退出码$? -eq 0判断是否成功。
这里有两个值得注意的脚本细节(从源码结构看):其一,成功提示中输出的是$PID而非$ProcessID(system-management.sh),而$PID在该脚本中并未赋值,实际输出为空,正确应改为$ProcessID;其二,kill需要目标进程属于当前用户或具有 root 权限,否则会返回非零退出码。
文件系统管理模块 ManagefileSys 深度解析
ManagefileSys(system-management.sh)提供 4 个文件系统检索功能加 1 个退出项:
- List Hard disk
- find a file with size
- find a file
- find a pattern in files in your system
- Quit
列出硬盘与文件系统(菜单项 1)
lsblk -flsblk -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!!!)。
已知占位与使用注意事项
基于对脚本源码的通读,以下几点对实际使用者最有价值:
- iptables 分支尚未实现:主菜单第 2 项
Adding a iptables rule.目前只有echo "Adding a iptables rule. "占位(system-management.sh),不会真正添加任何防火墙规则,选择后即返回主菜单; - Kill 成功提示的变量笔误:
echo "the pid: $PID is successfully killed."使用了未赋值的$PID,实际应引用$ProcessID; - 权限前提:
find /全盘遍历与kill目标进程均可能需要 root 权限,建议以sudo运行或以受限用户运行前评估权限边界; - 引号问题:
find / -name $fileName与grep -i $pattern中的变量建议加引号,以兼容含空格的文件名与模式; - 字段偏移:僵尸进程判定用
$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.
相关推荐
DevOps-Guide项目:Linux系统性能监控与进程管理命令详解
DevOps Guide项目:Linux系统性能监控与进程管理命令详解 引言:为什么需要系统性能监控? 在DevOps实践中,系统性能监控是确保服务稳定性和可靠
云原生CI/CD运维深度解析:Marker如何实现高效文档格式转换与智能提取
深度解析:Marker如何实现高效文档格式转换与智能提取 Marker文档转换工具是一个基于深度学习的多格式文档处理系统,专门解决PDF、图像、PPTX、DOC
人工智能AI 应用OCRDevOps-Guide 操作系统命令实战:Linux 性能监控与进程管理六大利器(top / ps / kill / df / ss / lsof)
DevOps Guide 操作系统命令实战:Linux 性能监控与进程管理六大利器(top / ps / kill / df / ss / lsof) 本指南以
云原生CI/CD运维
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考