定位: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}'

六、易错点 & 面试坑(错题笔记)

  1. ❌ 误区:看内存占用看 VSZ ✅ 纠正:看 RSS,VSZ 是虚拟地址空间,包含大量未实际占用的部分。
  2. ❌ 误区:load 高一定有高 CPU 进程 ✅ 纠正:大量 D 状态(IO等待)进程会拉高 load,但不消耗 CPU,top/ps 都看不到高 CPU 占用。
  3. ❌ 误区:僵尸进程用 kill -9 可以杀掉 ✅ 纠正:僵尸进程已经退出,无法直接杀死;需要杀掉它的父进程,让内核回收。
  4. ❌ 误区:ps aux 和 ps -ef 只是写法不同,输出一样 ✅ 纠正:两套不同标准体系,字段、侧重点完全不同;aux 看资源,-ef 看父子。
  5. ❌ 误区:TIME 列是进程运行时长 ✅ 纠正:是进程累计占用 CPU 的时间,休眠等待时间不算在内。
  6. ❌ 误区:ps -aux 是标准写法 ✅ 纠正:BSD 风格标准是 ps aux(不带横杠),带横杠是兼容写法,部分传统 Unix 系统会报错。

七、快速记忆口诀

aux 看资源,ef 看父子 内存看 RSS,虚拟看 VSZ R跑S睡D等IO,僵尸Z来暂停T 排序用 --sort,过滤用 grep

🔗 相关笔记