Shell 脚本 / 命令文档

Shell编程实战教程

$ cpu 17 个章节 Linux 命令详解

概述

编写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 | head

2. 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脚本的强大之处在于命令的组合和数据的流式处理!

同分类 · 其他命令文档