Shell 脚本 / 命令文档
Shell编程实战教程
概述
编写CPU占用TOP10进程监控脚本
教学目标
通过本课程,你将学会:
理解Linux进程管理的基本概念
掌握ps、top等系统监控命令的使用
学习Shell脚本的数据处理和排序技巧
编写实用的系统监控脚本
1. 核心命令介绍
| 命令 | 功能 | 常用参数 |
|---|---|---|
| ps | 显示当前进程状态 | aux(所有用户进程详细信息) |
| top | 动态显示进程信息 | -b(批处理模式)-n(迭代次数) |
| sort | 排序文本内容 | -k(指定列)-n(数值排序)-r(逆序) |
| awk | 文本处理工具 | 按列提取和处理数据 |
| head | 显示文件开头部分 | -n(指定行数) |
2. ps命令输出格式解析
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 169416 10240 ? Ss 08:00 0:01 /sbin/init
重要字段说明:
%CPU:CPU占用百分比(第3列)
%MEM:内存占用百分比(第4列)
COMMAND:进程命令(最后一列)
编写思路
使用 ps aux 命令获取所有进程的详细信息,包括CPU占用率。
使用 grep -v 或 sed 去除ps命令输出的表头行。
使用 sort -k3 -rn 按第3列(%CPU)进行数值逆序排序。
使用 head -10 获取排序后的前10条记录。
使用 awk 提取并格式化需要的字段,使输出更清晰。
方案一:基础版(使用ps命令)
#!/bin/bash
# CPU占用TOP10进程监控脚本 - 基础版
echo "=========================================="
echo " CPU占用TOP10进程列表"
echo "=========================================="
echo ""
ps aux | grep -v "PID" | sort -k3 -rn | head -10 | \
awk '{printf "%-10s %8s %8s %s\n", $2, $3"%", $4"%", $11}'方案二:增强版(带表头和时间戳)
#!/bin/bash
# CPU占用TOP10进程监控脚本 - 增强版
echo "=========================================="
echo " CPU占用TOP10进程列表"
echo " 时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
printf "%-10s %-10s %-10s %-30s\n" "PID" "CPU%" "MEM%" "COMMAND"
echo "----------------------------------------"
ps aux | grep -v "PID" | sort -k3 -rn | head -10 | \
awk '{printf "%-10s %-10s %-10s %-30s\n", $2, $3"%", $4"%", $11}'
echo "=========================================="方案三:专业版(使用top命令)
#!/bin/bash
# CPU占用TOP10进程监控脚本 - 专业版
echo "=========================================="
echo " CPU占用TOP10进程列表"
echo " 时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo " 主机: $(hostname)"
echo "=========================================="
printf "%-10s %-10s %-10s %-10s %-30s\n" "PID" "USER" "CPU%" "MEM%" "COMMAND"
echo "----------------------------------------"
# 使用top命令批处理模式获取一次数据
top -b -n 1 | grep -E "^ *[0-9]+" | sort -k9 -rn | head -10 | \
awk '{printf "%-10s %-10s %-10s %-10s %-30s\n", $1, $2, $9"%", $10"%", $12}'
echo "=========================================="1. 管道符的使用
管道符 | 将前一个命令的输出作为后一个命令的输入,实现命令链式处理。
ps aux | sort | head2. sort命令参数详解
-k3:按第3列排序
-r:reverse,逆序排序(从大到小)
-n:numeric,按数值排序(而非字符串)
提示:必须使用 -n 参数进行数值排序,否则"2"会被认为大于"10"!
3. awk格式化输出
# printf格式化输出
awk '{printf "%-10s %8s\n", $2, $3}'
# 格式说明:
# %-10s:左对齐,宽度10的字符串
# %8s:右对齐,宽度8的字符串
# $2, $3:引用第2列和第3列4. grep过滤技巧
# 排除表头行(包含"PID") ps aux | grep -v "PID" # 只保留进程行(以数字开头) top -b -n 1 | grep -E "^ *[0-9]+"
重要注意事项
常见错误1:字符串排序 错误:sort -k3 -r(缺少-n参数) 结果:9.9% 会排在 10.0% 前面(字符串排序) 正确:sort -k3 -rn
常见错误2:列号错位 不同命令输出的列位置不同: ps aux:CPU在第3列 top -b:CPU在第9列 使用前务必用 ps aux | head 确认列位置!
常见错误3:脚本权限问题 创建脚本后必须添加执行权限: chmod +x cpu_top10.sh
最佳实践: 脚本开头添加 #!/bin/bash 添加详细的注释说明脚本功能 使用有意义的变量名 输出格式要整齐美观 可以添加时间戳和主机名
最终完整脚本(推荐版本)
#!/bin/bash
##############################################
# 脚本名称:cpu_top10.sh
# 功能描述:监控并显示CPU占用最高的前10个进程
# 作者:Linux系统管理员
# 创建日期:2025-10-21
##############################################
# 清屏(可选)
# clear
# 打印标题
echo "=========================================="
echo " CPU占用TOP10进程监控"
echo "=========================================="
echo "主机名: $(hostname)"
echo "监控时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo ""
# 打印表头
printf "%-8s %-12s %-8s %-8s %-40s\n" \
"排名" "PID" "CPU%" "MEM%" "进程命令"
echo "--------------------------------------------------------------------------------"
# 获取并显示TOP10进程
ps aux | grep -v "PID" | sort -k3 -rn | head -10 | \
awk '{printf "%-8d %-12s %-8s %-8s %-40s\n", NR, $2, $3"%", $4"%", $11}'
echo "================================================================================"
echo "说明:CPU%和MEM%为进程占用的百分比"
echo "================================================================================"使用方法
vi cpu_top10.sh # 或者 nano cpu_top10.sh
chmod +x cpu_top10.sh
./cpu_top10.sh # 或者绝对路径 /path/to/cpu_top10.sh
# 编辑crontab crontab -e # 每5分钟执行一次,并记录到日志 */5 * * * * /path/to/cpu_top10.sh >> /var/log/cpu_monitor.log 2>&1
扩展练习
修改为内存TOP10:将排序列改为第4列(%MEM)
添加告警功能:当CPU超过80%时发送邮件通知
输出到文件:将结果保存到日志文件,便于历史追溯
交互式选择:让用户选择查看CPU还是内存TOP10
彩色输出:使用ANSI颜色代码美化输出
学习总结
本课程核心知识点:
掌握了ps、sort、awk、head等命令的组合使用
理解了管道符在命令链中的作用
学会了数值排序和格式化输出
编写了实用的系统监控脚本
记住:Shell脚本的强大之处在于命令的组合和数据的流式处理!