ps 命令详解
更新时间:2026-08-29。本文是「一个命令一个文档」系列,属于进程管理命令。排查"哪个进程吃 CPU""服务起没起来",第一招就是
ps。
为什么写 ps?因为它有两套语法(BSD 的 aux 和 System V 的 -ef),新手常被搞晕;更关键的是输出里的 STAT 列(R/S/D/Z/T)藏着进程死活的真信号——Z 是僵尸、D 是卡 IO 不可中断,这些不看懂就只会干瞪眼。
ps(process status,进程状态)抓取当前时刻的进程快照(静态)。要看实时变化用 top。
一、两种风格:BSD vs System V
ps aux # BSD 风格,无前导 -
ps -ef # System V 风格,有前导 -两者都常用,输出略不同:
ps aux:含%CPU %MEM等易读列,新手友好。ps -ef:标准格式,含PPID(父进程),看进程树关系方便。
记住一条就够日常:
ps aux最直观。要看"谁是我爸、谁是我儿子"用ps -ef或ps -ejH(树状)。
二、STAT 状态码:进程的体检表
STAT 列是 ps 最该读懂的部分,单个字母含义:
| 码 | 含义 | 说明 |
|---|---|---|
R | Running/Runnable | 运行中或就绪排队,正常 |
S | Sleeping(可中断) | 等事件(IO/信号),绝大多数进程常态 |
D | 不可中断睡眠 | 卡在磁盘/IO,kill 不掉,危险信号 |
Z | Zombie 僵尸 | 死了对但父进程没回收,需重启父进程 |
T | Stopped/Traced | 被 SIGSTOP 或调试器暂停 |
I | Idle(内核线程空闲) | 新内核才有的 idle 线程 |
+ | 前台进程组 | 附加在状态后,如 R+ |
< | 高优先级 | 附加标记 |
N | 低优先级 | 附加标记 |
s | session leader | 会话首领 |
l | 多线程 | 多线程进程 |
重点盯三个:
D持续出现说明存储 IO 卡死(可能磁盘坏了/网络盘断了);Z堆积说明有程序狂生孩子不回收(常见于崩溃的服务);R长时间 100% 是 CPU 热点。
三、高频选项一张表
| 选项 | 作用 | 示例 |
|---|---|---|
aux | BSD 全量+资源列 | ps aux |
-ef | 标准格式含 PPID | ps -ef |
-ejH | 树状层级显示 | ps -ejH |
-u 用户 | 只看某用户进程 | ps -u www |
-p PID | 看指定 PID | ps -p 1234 |
--sort | 排序 | ps aux --sort=-%cpu |
-o | 自定义输出列 | ps -eo pid,comm,%cpu |
-L | 显示线程 | ps -eLf |
四、实战 demo
demo 1:找出最吃 CPU 的进程
ps aux --sort=-%cpu | head -6
# --sort=-%cpu 降序,-%mem 则按内存;head 看前几名demo 2:找出最耗内存的进程
ps aux --sort=-%mem | head -6
# 内存泄漏排查第一招:看谁 RES 列异常大demo 3:只看某个服务的进程(配合 grep)
ps aux | grep nginx | grep -v grep
# 第二道 grep -v grep 去掉"grep 自己"那一行
# 更准:pgrep nginx,见 pgrepdemo 4:揪出僵尸进程
ps aux | awk '$8 ~ /Z/' # 第8列(STAT)含 Z 的行
# 或 ps -ef | awk '$8=="Z"';看到 Z 要找出其父进程(PPID)重启它demo 5:看进程树(谁是谁的父)
ps -ejH | grep -C3 nginx
# -H 层级缩进,直观看到 master/worker 关系demo 6:自定义精简列(脚本里好解析)
ps -eo pid,ppid,stat,comm,%cpu,%mem --sort=-%cpu | head
# -o 只取要的列,输出干净,适合喂给脚本/监控五、和 top / kill / pkill 的协作
- top:
ps是快照,top 是实时刷新。想盯动态用 top。 - kill:拿到 PID 后
kill PID发信号终止,见 kill。 - pkill:按名字批量杀,
pkill nginx比ps | grep | xargs kill干净,见 pkill。
ps aux --sort=-%cpu | head -2 | awk 'NR>1{print $2}' | xargs kill
# 杀掉最耗 CPU 的那个( awk NR>1 跳过表头)六、常见坑
ps是快照,两次ps之间进程可能已变;看趋势用 top 或watch ps。grep nginx会把自己也匹配出来,记得grep -v grep或用 pgrep。D状态进程kill -9也杀不掉——它在内核 IO 里,只能等 IO 恢复或重启机器。VSZ是虚拟内存(含共享库、映射),RES才是实际物理占用,别被 VSZ 吓到。ps aux的COMMAND列默认截断,看完整用ps auxww(两个w加宽输出)。
相关命令
七、进阶:把 ps 写进监控与排障链路
ps 是脚本取数的主力,下面几条是运维里反复出现的组合:
# 1. 找出"跑了很久还没完"的进程(etime 累计时间)
ps -eo pid,etime,comm,cmd --sort=etime | tail -10
# 2. 揪出内存泄漏嫌疑:按 RES 排、只看常驻大的
ps -eo pid,user,rss,comm --sort=-rss | head -8
# 3. 配合 watch 做轻量实时(比 top 更聚焦某列)
watch -n 2 'ps -eo pid,pcpu,pmem,comm --sort=-pcpu | head -6'
# 4. 容器视角:看某容器内进程(cgroup 隔离下才有意义)
ps -eo pid,ppid,cgroup,comm | grep -i dockeretime(已运行时间)和 rss(常驻物理内存 KB)是报警脚本的两个金指标:前者抓"卡死没退出"的批任务,后者抓"悄悄吃内存"的泄漏。
八、输出格式与坑的延伸
- BSD 还是 System V:
ps aux(BSD 风,a=所有用户 u=详细 x=含无终端)和ps -ef(System V 风,e=所有 f=全格式)并存,混用会报怪错。记一套就够,本项目统一用aux/ejH。 STAT第二字符是附加标志:Ss的s=会话首领、+=前台进程组、<=高优先级、N=低优先级;D+<是"高优先不可中断",最危险。- 线程视图:
ps -eLf把线程拆成独立行(LWP 列),排查多线程程序 CPU 不均时用,比只看进程准。 - 容器里 ps 看的是宿主机:除非正确隔离 namespace,否则容器里
ps aux能看到宿主机全部进程,这是常见误判来源——看容器真实占用用docker top或 cgroup 工具。
四件套定位流程:
ps取快照找嫌疑 → top 看动态 → kill 处理 → lsof 查占用尾巴。这是排障的标准动线。
一句话总结
ps = 进程快照:ps aux(BSD,含CPU/内存) 与 ps -ef(含PPID) 两套风格并存;重点读 STAT——R运行/S睡眠/D卡IO杀不掉/Z僵尸需重启父进程/T暂停;--sort=-%cpu/-%mem 找热点,配合 grep 或 pgrep 定位后交给 kill。