定位:Linux 进程查看核心工具,全称为 Process Status,读取
/proc虚拟文件系统生成进程快照,一次性输出,不会自动刷新(和top/htop实时持续刷新有本质区别)。是运维排障、性能排查、面试的基础核心命令。
一、两大语法风格(最容易混淆的点)
ps 兼容两套历史标准,参数带不带横杠是完全不同的两套体系,这也是新手最懵的地方。
1. BSD 风格(参数不带横杠,最常用:aux)
ps aux
- 来源:BSD 系统传承的写法
- 特点:侧重资源占用(CPU、内存),适合排查性能问题
- 注意:
ps -aux也能兼容运行,但本质是 BSD 风格,标准写法不带横杠
2. System V 风格(参数带横杠,最常用:-ef)
ps -ef
- 来源:System V 标准写法
- 特点:侧重进程父子关系(PPID),适合排查进程链路、僵尸进程
面试一句话总结:
aux看资源,-ef看父子,两套风格参数不建议混写。
二、核心字段详解
1. ps aux 字段全解
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
| 字段 | 含义 | 重点说明 |
|---|---|---|
| USER | 进程所属用户 | |
| PID | 进程ID | 杀进程、排查的核心标识 |
| %CPU | CPU 占用百分比 | |
| %MEM | 物理内存占用百分比 | |
| VSZ | 虚拟内存大小(单位KB) | 无实际参考价值,包含所有申请的虚拟地址空间、共享库、swap |
| RSS | 物理内存大小(单位KB) | ✅ 排查内存占用看这个,代表进程实际占用的物理内存 |
| TTY | 所属终端 | ? 代表后台守护进程,和终端无关 |
| STAT | 进程状态 | 见下文详细拆解,排障/面试核心 |
| START | 进程启动时间 | 运行很久会显示日期 |
| TIME | 累计占用 CPU 时间 | 不是运行时长,是实际占用CPU的总时长 |
| COMMAND | 启动命令 |
2. ps -ef 字段全解
UID PID PPID C STIME TTY TIME CMD
| 字段 | 含义 | 重点说明 |
|---|---|---|
| UID | 用户ID(数字) | aux 显示用户名,-ef 显示数字ID |
| PID | 进程ID | |
| PPID | 父进程ID | ✅ 核心字段,找父进程、查僵尸进程必备 |
| C | CPU 使用率 | 旧版字段,精度不如 aux 的 %CPU |
| STIME | 启动时间 | |
| TTY | 所属终端 | |
| TIME | CPU累计时间 | |
| CMD | 启动命令 | 部分场景会截断 |
三、STAT 进程状态详解(面试+排障核心)
STAT 列由「基础状态 + 后缀标记」组成,比如 Ss、R+、D<。
基础状态(第一个字母)
| 状态 | 全称 | 含义 | 排障意义 |
|---|---|---|---|
| R | Running | 运行中 / 就绪队列等待CPU | 正常运行状态 |
| S | Sleeping | 可中断休眠(等待事件、信号可唤醒) | 大部分后台进程的常态 |
| D | Disk Sleep | 不可中断休眠(等待磁盘IO) | ✅ 重点:load 高但 CPU 空闲的元凶;kill -9 杀不掉,只能等IO完成或重启 |
| Z | Zombie | 僵尸进程 | 子进程已退出,父进程未回收,只占用PID,不占CPU内存 |
| T | Stopped | 暂停状态 | 收到 SIGSTOP 信号,或终端作业控制暂停 |
| I | Idle | 内核空闲线程 |
常见后缀标记
| 标记 | 含义 |
|---|---|
s |
会话首进程(session leader) |
< |
高优先级进程 |
N |
低优先级进程 |
+ |
前台进程组,在终端运行 |
l |
多线程进程 |
四、高频进阶用法
1. 按资源排序(排查性能问题)
# 按 CPU 降序,取前5
ps aux --sort=-%cpu | head -6
# 按物理内存降序,取前5
ps aux --sort=-rss | head -6
说明:
--sort=-xxx降序,--sort=+xxx升序;head 取6是包含标题行
2. 自定义输出字段(脚本采集专用)
# 只输出 PID、RSS、COMMAND,适合脚本解析
ps -eo pid,rss,cmd --sort=-rss | head -10
3. 查看线程(排查多线程程序)
# 显示指定进程下的所有线程
ps -T -p <PID>
4. 按用户过滤
# 查看 root 用户的所有进程
ps -u root
5. 查看进程树(父子关系)
ps -ejH
# 搭配 pstree 更直观
pstree -p <PID>
五、运维经典实操场景
场景1:查找指定进程
# 基础写法(会把 grep 自身也搜出来)
ps aux | grep nginx
# 进阶写法(排除 grep 自身,不用额外过滤)
ps aux | grep '[n]ginx'
场景2:查找僵尸进程
# STAT 为 Z 的就是僵尸进程
ps aux | awk '$8 == "Z"'
场景3:根据 PID 找父进程
ps -ef | grep <PID>
# 看 PPID 列即可
场景4:查看占用内存最高的进程名
ps aux --sort=-rss | awk 'NR==2{print $11}'
六、易错点 & 面试坑(错题笔记)
- ❌ 误区:看内存占用看 VSZ ✅ 纠正:看 RSS,VSZ 是虚拟地址空间,包含大量未实际占用的部分。
- ❌ 误区:load 高一定有高 CPU 进程 ✅ 纠正:大量 D 状态(IO等待)进程会拉高 load,但不消耗 CPU,top/ps 都看不到高 CPU 占用。
- ❌ 误区:僵尸进程用 kill -9 可以杀掉 ✅ 纠正:僵尸进程已经退出,无法直接杀死;需要杀掉它的父进程,让内核回收。
- ❌ 误区:ps aux 和 ps -ef 只是写法不同,输出一样 ✅ 纠正:两套不同标准体系,字段、侧重点完全不同;aux 看资源,-ef 看父子。
- ❌ 误区:
TIME列是进程运行时长 ✅ 纠正:是进程累计占用 CPU 的时间,休眠等待时间不算在内。 - ❌ 误区:
ps -aux是标准写法 ✅ 纠正:BSD 风格标准是ps aux(不带横杠),带横杠是兼容写法,部分传统 Unix 系统会报错。
七、快速记忆口诀
aux 看资源,ef 看父子 内存看 RSS,虚拟看 VSZ R跑S睡D等IO,僵尸Z来暂停T 排序用 --sort,过滤用 grep
🔗 相关笔记
- 进程和线程
- Linux01 命令系统实战笔记
- Linux系统资源全方位巡检
评论