命令ps aux --sort=-%cpu | head是 Linux 下按 CPU 使用率降序查看最耗 CPU 的进程的常用组合。
一、命令分解
psaux --sort=-%cpu|head| 部分 | 作用 |
|---|---|
ps | 进程快照(Process Snapshot)工具 |
aux | BSD 风格选项组合(非 GNU 长选项) |
--sort=-%cpu | 按%CPU字段降序排序(-表示降序) |
| ` | ` |
head | 默认输出前 10 行 |
二、ps aux详解(BSD 语法)
虽然ps支持 SysV(-ef)和 BSD(aux)两种风格,但aux是历史沿用的组合:
| 字母 | 含义 |
|---|---|
a | 显示所有终端上的进程(包括其他用户) |
u | 以面向用户的格式输出(含%CPU,%MEM,TTY,START,COMMAND等) |
x | 显示无控制终端的进程(如守护进程、后台服务) |
✅等效 GNU 写法:
ps -eo pid,ppid,user,%cpu,%mem,vsz,rss,tty,stat,start,time,command --sort=-%cpu
三、--sort=-%cpu排序机制
%cpu字段:
表示进程自启动以来的平均 CPU 使用率(非瞬时值),计算方式:%CPU = (进程使用的 CPU 时间 / 进程存活总时间) × 100%⚠️ 注意:该值可能 > 100%(多核下,如 4 核满载 = 400%)
-前缀:表示降序(descending);若写+%cpu则为升序。排序时机:
ps在生成完整进程列表后,在内存中排序,再输出。
四、| head的作用
- 默认行为:
head读取 stdin,输出前 10 行。 - 为何需要?
ps aux可能输出数百行,head截断以聚焦 top N 进程。 - 自定义行数:
head -n 5→ 前 5 行(含标题)
💡注意:
head会包含ps的标题行(USER PID %CPU ...),实际进程行为 9 行。
五、完整输出结构示例
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 168780 13428 ? Ss Jan01 0:15 /sbin/init www-data 12345 85.2 2.3 500234 189024 ? R 10:00 12:34 php-fpm: pool www mysql 67890 45.1 5.6 1200M 450M ? Ssl Jan01 120:30 /usr/sbin/mysqld ...| 字段 | 说明 |
|---|---|
| USER | 进程所有者 |
| PID | 进程 ID |
| %CPU | CPU 使用率(关键排序字段) |
| %MEM | 物理内存使用百分比 |
| VSZ | 虚拟内存大小(KB) |
| RSS | 常驻内存集(物理内存,KB) |
| TTY | 控制终端(?表示无) |
| STAT | 进程状态(R=运行,S=睡眠,Z=僵尸) |
| START | 启动时间 |
| TIME | 累计 CPU 时间([DD-]HH:MM:SS) |
| COMMAND | 启动命令(可能被截断) |
六、典型使用场景
快速定位高 CPU 进程
psaux --sort=-%cpu|head-n5结合
grep过滤特定进程psaux --sort=-%cpu|grepphp监控脚本中提取 PID
TOP_PHP_PID=$(psaux --sort=-%cpu|grep'php-fpm'|head-n2|tail-n1|awk'{print $2}')
七、局限性与注意事项
| 问题 | 说明 |
|---|---|
| %CPU 是平均值 | 短时峰值可能被平滑,无法反映瞬时抖动 |
| 多线程进程显示不准 | ps默认按进程聚合,线程级 CPU 需ps -L |
| COMMAND 被截断 | 长命令名显示不全,可用ps -o pid,cmd --sort=-%cpu |
| 无实时刷新 | 仅单次快照,持续监控需top或htop |
🔧替代方案:
- 实时监控:
top -o %CPU- 精确线程级:
ps -T -p <PID> -o pid,tid,pcpu,comm
八、总结
ps aux:获取全量进程快照(BSD 风格)--sort=-%cpu:按 CPU 使用率降序排列| head:截取 top N 结果(含标题)- 核心价值:快速诊断 CPU 瓶颈进程,是系统运维的“第一响应”命令。
💡工程习惯:
在脚本中避免依赖aux(不同系统ps行为可能差异),
改用 POSIX 兼容写法:ps-eo pid,pcpu,comm --sort=-pcpu|head