第 6 章 · 01 看进程: 两套风格 本节摘要:本章我们从「文件」转到「正在运行的程序」——进程。第一个要学的命令是 ,它给进程拍「快照」——列出现在有哪些进程、各自什么状态、占多少资源。但 有个让新手头疼的历史包袱:它有两套选项风格,BSD 风格(选项不带横杠,如 )和 System V 风格(选项带横杠,如 ),两者输出格式不同、字段含义也不同。本节要把这两套风格的来历与差别讲清,让你看懂任何一篇文档里抄来的 命令,并重点解读输出里那列神秘的 (进程状态)。理解 ,是理解后续 、 、 的起点。 内容来源:原项目「Linux 命令大全」 ,精选并套用体系化模板。
ps 两套风格本节摘要:本章我们从「文件」转到「正在运行的程序」——进程。第一个要学的命令是
ps,它给进程拍「快照」——列出现在有哪些进程、各自什么状态、占多少资源。但ps有个让新手头疼的历史包袱:它有两套选项风格,BSD 风格(选项不带横杠,如ps aux)和 System V 风格(选项带横杠,如ps -ef),两者输出格式不同、字段含义也不同。本节要把这两套风格的来历与差别讲清,让你看懂任何一篇文档里抄来的ps命令,并重点解读输出里那列神秘的STAT(进程状态)。理解ps,是理解后续kill、top、lsof的起点。
内容来源:原项目「Linux 命令大全」
command/ps.md,精选并套用体系化模板。
阅读完本节,你应当能够:
ps aux(BSD 风格)与 ps -ef(System V 风格)两种方式列出进程,理解两者输出格式的差别。ps 有两套选项风格(历史分裂:BSD 与 System V 两个 Unix 分支)。ps aux 输出的各列:USER/PID/%CPU/%MEM/VSZ/RSS/TTY/STAT/START/TIME/COMMAND。STAT 列的每个字母:R(运行)、S(睡眠)、D(不可中断睡眠)、Z(僵尸)、T(停止)。--sort 按指定字段排序,用 -p/-C/-u 过滤特定进程。ps 的两套选项风格,是 Unix 历史分裂的活化石。上世纪 80 年代,Unix 分成两大分支:BSD 分支(加州伯克利)和 System V 分支(AT&T)。两家各自实现了 ps,选项约定不同:
ps aux、ps ax。这是 Linux 上最常用的写法。ps -ef、ps -l。GNU 的 ps(Linux 上的版本)为了兼容两者,两套都支持——这就是今天新手困惑的根源:为什么 ps aux 和 ps -ef 都能用、却长得不一样。答案就是它们是两套不同传统的写法。
💡 技巧:记一个就够了。日常用
ps aux(BSD 风格),它的输出信息最全(%CPU、%MEM、STAT都有),是排查的首选。看文档时遇到ps -ef,知道它是 System V 风格的等价写法即可。
ps aux # BSD 风格: 列出所有进程, 输出含 %CPU/%MEM/STAT ps -ef # System V 风格: 列出所有进程, 输出含 PPID(父进程) ps -eLf # 显示所有进程的所有线程(LWP)
ps aux 的典型输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 169372 13472 ? Ss 10:00 0:02 /sbin/init user 1234 2.3 1.5 50020 31000 pts/0 Ss 10:05 0:05 -bash user 5678 0.0 0.2 12000 4200 pts/0 R+ 10:30 0:00 ps aux
各列含义:
| 列 | 含义 |
|---|---|
USER |
进程属主 |
PID |
进程 ID(唯一标识,后续 kill 用它) |
%CPU |
CPU 占用百分比 |
%MEM |
物理内存占用百分比 |
VSZ |
虚拟内存大小(KB) |
RSS |
实际使用的物理内存(KB,这个最实用) |
TTY |
关联的终端(? 表示无终端,通常是后台服务) |
STAT |
进程状态(见下文,本章核心) |
START |
进程启动时间 |
TIME |
累计占用 CPU 的时间 |
COMMAND |
启动该进程的命令 |
STAT 列是本章的核心,它告诉你进程「现在在干什么」。第一位字母是主状态:
| 字母 | 含义 | 说明 |
|---|---|---|
R |
running/ready | 正在运行或在就绪队列等 CPU |
S |
interruptible sleep | 可中断睡眠,等某事件(大多数进程的常态) |
D |
uninterruptible sleep | 不可中断睡眠(通常在等磁盘 IO,杀不掉) |
Z |
zombie | 僵尸(已死但父进程没回收) |
T |
stopped/traced | 停止(Ctrl+Z 或被调试器 attach) |
后面可能跟附加字符:s(会话首进程)、l(多线程)、+(前台进程组)、<(高优先级)。
ps -C nginx # 按命令名查 nginx 进程 ps -p 1234 # 查指定 PID ps -u user # 查某用户的所有进程 ps aux --sort=-%cpu # 按 CPU 占用降序(找吃 CPU 的) ps aux --sort=-%mem # 按内存占用降序(找吃内存的) ps aux | grep nginx # 配合 grep 找某进程(最常用)
ps aux | grep 把自己也列出来了ps aux | grep nginx # 最后一行是 grep 自己(grep nginx 命令), 不是 nginx 进程 ps aux | grep nginx | grep -v grep # 过滤掉 grep 自己 ps aux | grep [n]ginx # 巧用正则: [n]ginx 不匹配 "grep nginx" 字面
[n]ginx 这个技巧很经典——grep 进程的命令行是字面 grep [n]ginx,正则 [n]ginx 匹配 nginx 但不匹配字面 [n]ginx,所以过滤掉了 grep 自己。
VSZ 与 RSS 的差别VSZ = 进程申请的虚拟内存(含未实际使用的), 通常很大 RSS = 实际占用的物理内存, 这个才反映"真占了多少"
很多人看到 VSZ 几个 G 就慌了——其实那是虚拟地址空间(含映射但未实际使用的),真正占内存看 RSS。
STAT 是 Z 的僵尸进程,占的 CPU/内存极少,但每个僵尸仍占用一个 PID 与一个进程表项。系统 PID 数量有限(默认几万),僵尸堆积会耗尽 PID,导致无法启动新进程。僵尸的处理见第 03 节。
ps 有两套风格:BSD(ps aux,无横杠)与 System V(ps -ef,带横杠),是 Unix 历史分裂的活化石;日常用 ps aux 即可。PID(标识)、RSS(实际内存,比 VSZ 实用)、STAT(状态,本章核心)。R 运行、S 睡眠、D 不可中断睡眠、Z 僵尸、T 停止。--sort=-%cpu 找吃 CPU 的、-C 名字 按命令查、| grep 配合管道。grep 自己会出现在结果里,用 grep -v grep 或 [n]ginx 技巧过滤。下一节讲 top/htop——如果说 ps 是「拍照」,那 top 就是「录像」,实时刷新看进程变化。