第 6 章 · 01 看进程:`ps` 两套风格


文档摘要

第 6 章 · 01 看进程: 两套风格 本节摘要:本章我们从「文件」转到「正在运行的程序」——进程。第一个要学的命令是 ,它给进程拍「快照」——列出现在有哪些进程、各自什么状态、占多少资源。但 有个让新手头疼的历史包袱:它有两套选项风格,BSD 风格(选项不带横杠,如 )和 System V 风格(选项带横杠,如 ),两者输出格式不同、字段含义也不同。本节要把这两套风格的来历与差别讲清,让你看懂任何一篇文档里抄来的 命令,并重点解读输出里那列神秘的 (进程状态)。理解 ,是理解后续 、 、 的起点。 内容来源:原项目「Linux 命令大全」 ,精选并套用体系化模板。

第 6 章 · 01 看进程:ps 两套风格

本节摘要:本章我们从「文件」转到「正在运行的程序」——进程。第一个要学的命令是 ps,它给进程拍「快照」——列出现在有哪些进程、各自什么状态、占多少资源。但 ps 有个让新手头疼的历史包袱:它有两套选项风格,BSD 风格(选项不带横杠,如 ps aux)和 System V 风格(选项带横杠,如 ps -ef),两者输出格式不同、字段含义也不同。本节要把这两套风格的来历与差别讲清,让你看懂任何一篇文档里抄来的 ps 命令,并重点解读输出里那列神秘的 STAT(进程状态)。理解 ps,是理解后续 killtoplsof 的起点。

内容来源:原项目「Linux 命令大全」command/ps.md,精选并套用体系化模板。

学习目标

阅读完本节,你应当能够:

  1. ps aux(BSD 风格)与 ps -ef(System V 风格)两种方式列出进程,理解两者输出格式的差别。
  2. 说清为什么 ps 有两套选项风格(历史分裂:BSD 与 System V 两个 Unix 分支)。
  3. 解读 ps aux 输出的各列:USER/PID/%CPU/%MEM/VSZ/RSS/TTY/STAT/START/TIME/COMMAND
  4. 重点解读 STAT 列的每个字母:R(运行)、S(睡眠)、D(不可中断睡眠)、Z(僵尸)、T(停止)。
  5. --sort 按指定字段排序,用 -p/-C/-u 过滤特定进程。

一、设计动机:为什么 ps 有两套风格

ps 的两套选项风格,是 Unix 历史分裂的活化石。上世纪 80 年代,Unix 分成两大分支:BSD 分支(加州伯克利)和 System V 分支(AT&T)。两家各自实现了 ps,选项约定不同:

  • BSD 风格:选项不带横杠。如 ps auxps ax。这是 Linux 上最常用的写法。
  • System V 风格:选项带横杠。如 ps -efps -l

GNU 的 ps(Linux 上的版本)为了兼容两者,两套都支持——这就是今天新手困惑的根源:为什么 ps auxps -ef 都能用、却长得不一样。答案就是它们是两套不同传统的写法。

💡 技巧:记一个就够了。日常用 ps aux(BSD 风格),它的输出信息最全(%CPU%MEMSTAT 都有),是排查的首选。看文档时遇到 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(进程状态)

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 找某进程(最常用)

三、踩坑与排错

坑 1: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 自己。

坑 2:VSZRSS 的差别

VSZ = 进程申请的虚拟内存(含未实际使用的), 通常很大 RSS = 实际占用的物理内存, 这个才反映"真占了多少"

很多人看到 VSZ 几个 G 就慌了——其实那是虚拟地址空间(含映射但未实际使用的),真正占内存看 RSS

坑 3:僵尸进程不消耗 CPU 但仍危险

STATZ 的僵尸进程,占的 CPU/内存极少,但每个僵尸仍占用一个 PID 与一个进程表项。系统 PID 数量有限(默认几万),僵尸堆积会耗尽 PID,导致无法启动新进程。僵尸的处理见第 03 节。

本节要点回顾

  1. ps 有两套风格:BSD(ps aux,无横杠)与 System V(ps -ef,带横杠),是 Unix 历史分裂的活化石;日常用 ps aux 即可。
  2. 关键列:PID(标识)、RSS(实际内存,比 VSZ 实用)、STAT(状态,本章核心)。
  3. STAT 主状态:R 运行、S 睡眠、D 不可中断睡眠、Z 僵尸、T 停止。
  4. 过滤排序:--sort=-%cpu 找吃 CPU 的、-C 名字 按命令查、| grep 配合管道。
  5. grep 自己会出现在结果里,用 grep -v grep[n]ginx 技巧过滤。

下一节讲 top/htop——如果说 ps 是「拍照」,那 top 就是「录像」,实时刷新看进程变化。


发布者: 作者: 灏天文库 转发
评论区 (0)
U