🔍搜索⌘K

Linux ps 命令深度解析:从三种选项风格到进程查看实战

概述

在 Linux 系统中,ps(Process Status 的缩写)是查看进程状态的核心命令—— 它能实时抓取系统中运行的进程信息,包括进程 ID(PID)、占用资源(CPU / 内存)、运行用户、启动时间等关键数据,是运维排查进程异常(如僵尸进程、高资源占用进程)、开发调试程序的必备工具。

不同于多数 Linux 命令 “单一选项风格” 的设计,ps 命令因历史兼容性,支持 Unix、BSD、GNU 三种截然不同的选项风格,这也是新手使用 ps 时最易混淆的点(比如分不清 -ef 和 aux 的区别)。本文将从 “选项风格分类”“核心命令实战”“进阶用法” 三个维度,拆解 ps 命令的细节,帮你根据场景灵活选择合适的命令,精准获取进程信息。

一、核心基础:ps 命令的三种选项风格

ps 命令的选项风格差异源于其发展历史(兼容 Unix、BSD 等不同系统的设计习惯),三种风格的语法规则、选项含义均有区别,但最终目的都是 “筛选并展示进程信息”。掌握每种风格的核心特点,是正确使用 ps 的前提。

三种风格的核心区别

风格类型语法特点选项前缀典型示例适用场景
Unix 风格选项前加 -(短横线),选项可组合使用-ps -ef、ps -efl查看系统全局进程、进程父子关系(运维常用)
BSD 风格选项前不加任何前缀,选项可组合使用无ps aux、ps auxw查看进程资源占用(CPU / 内存百分比)、用户维度进程
GNU 风格选项前加 —(双短横线),多为长选项—ps —forest、ps —sort=-%cpu进阶功能(如进程树、按资源排序),可与前两种风格混用

关键提醒:

  • 三种风格不可随意混合选项前缀(如不能写成 ps -aux 或 ps —ef),但 GNU 风格的长选项可与 Unix/BSD 风格组合(如 ps aux —forest);
  • 日常使用中,Unix 风格的 -ef 和 BSD 风格的 aux 是最高频的两种命令,需重点掌握。

二、实战解析:高频 ps 命令与输出解读

本节针对三种风格中最常用的命令,逐一讲解 “选项含义”“输出字段解读” 和 “适用场景”,帮你看完就能直接上手。

1. Unix 风格:ps -ef 与 ps -efl(全局进程与长格式)

Unix 风格的 ps -ef 是运维排查 “系统所有进程” 的首选命令,能显示进程的完整信息(包括 PID、父进程 ID、启动时间等),加上 -l 选项后会输出更详细的 “长格式”。

(1)ps -ef:查看系统所有进程

# 查看系统中所有运行的进程(Unix 风格)
ps -ef

选项含义:

  • -e(equal to -A):显示所有进程(包括系统进程、用户进程,无任何过滤);
  • -f(full format):输出 “完整格式”,包含更多关键字段(比默认格式多了 UID、PPID、STIME 等)。

输出字段解读(关键字段已标注):

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:00 ?        00:00:02 /sbin/init
root         2     0  0 08:00 ?        00:00:00 [kthreadd]
vagrant   1234  1000  0 09:30 pts/0    00:00:01 /usr/bin/python3
字段含义示例解读
UID进程所属用户 IDroot 表示系统进程,vagrant 表示普通用户进程
PID进程唯一 ID(核心字段)1 是系统初始化进程(init/systemd),所有进程的 “祖先”
PPID父进程 ID(Parent PID)1234 进程的父进程是 1000,可通过 PPID 找进程父子关系
C进程占用 CPU 的百分比(单位:%)0 表示当前 CPU 占用低,数值越大占用越高
STIME进程启动时间08:00 表示进程在早上 8 点启动(若启动超过 24 小时,会显示日期)
TTY进程关联的终端? 表示 “无终端关联”(多为系统后台进程),pts/0 表示关联到第 0 个虚拟终端
TIME进程累计占用 CPU 的时间00:00:02 表示进程从启动到现在共占用 2 秒 CPU 时间
CMD进程的启动命令(含参数)/usr/bin/python3 表示该进程是 Python3 程序

适用场景:

  • 查找某个进程是否在运行(如 ps -ef | grep nginx 查看 Nginx 进程);
  • 查看进程的父进程(通过 PPID 追溯进程来源,如排查 “谁启动了这个异常进程”)。

(2)ps -efl:长格式显示,补充进程状态

在 -ef 基础上增加 -l(long format)选项,会额外显示 “进程状态(STAT)”“优先级(PRI)” 等字段,适合更细致的进程分析:

ps -efl

新增关键字段:

字段含义示例
STAT进程状态(核心字段)R(运行中)、S(休眠中)、Z(僵尸进程)、T(暂停)
PRI进程优先级(数值越小优先级越高)20(默认优先级)、10(高优先级)
NI进程 nice 值(调整优先级的参数)0(默认)、-5(优先级更高)、10(优先级更低)

示例输出(部分):

F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 - 56139 ep_pol 08:00 ?        00:00:02 /sbin/init
1 R vagrant   1234  1000  0  80   0 - 12345 -      09:30 pts/0    00:00:01 /usr/bin/python3
  • 字段 STAT 中的 S 表示 “休眠中”(进程等待事件完成,如等待 IO),R 表示 “运行中”(正在占用 CPU 或等待 CPU 调度);
  • 若出现 STAT 为 Z 的进程(僵尸进程),需通过 kill -9 父进程 PID 清理(僵尸进程已死亡,但父进程未回收其资源)。

2. BSD 风格:ps aux(资源占用与用户维度)

BSD 风格的 ps aux 是查看 “进程资源占用” 的高频命令,输出格式更贴近 “用户视角”,会显示 CPU 占用百分比(% CPU) 和 内存占用百分比(% MEM),方便快速定位高资源消耗进程。

命令格式:

# 查看所有进程(含无终端进程),按用户维度显示资源占用(BSD 风格)
ps aux

选项含义:

  • a(all with tty):显示所有与终端关联的进程(包括其他用户的终端进程,不仅是当前用户);
  • u(user-oriented format):输出 “用户导向格式”,重点展示资源占用字段(% CPU、% MEM、VSZ、RSS);
  • x(exclude terminal-less):显示无终端关联的进程(如系统后台进程、守护进程,弥补 a 选项的遗漏)。

输出字段解读(核心关注资源字段):

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 100000  2048 ?        Ss   08:00   0:02 /sbin/init
root         2  0.0  0.0      0     0 ?        S    08:00   0:00 [kthreadd]
vagrant   1234  5.0  2.0 200000 40960 pts/0    R+   09:30   0:10 /usr/bin/python3
字段含义示例解读
USER进程所属用户名(比 UID 更直观)root、vagrant
%CPU进程当前占用 CPU 的百分比5.0 表示占用 5% CPU(数值超过 100 表示多线程进程,如 200 表示占用 2 个 CPU 核心)
%MEM进程占用物理内存的百分比2.0 表示占用系统总内存的 2%
VSZ进程虚拟内存大小(单位:KB)200000 表示虚拟内存占用 200MB(包含代码、数据、共享库等)
RSS进程实际占用物理内存大小(单位:KB)40960 表示物理内存占用 40MB(比 VSZ 更能反映实际内存消耗)
START进程启动时间(格式更简洁)09:30 表示早上 9 点 30 分启动
COMMAND进程启动命令(不含路径时显示简写)python3 等同于 /usr/bin/python3

适用场景:

  • 定位高 CPU / 内存占用进程(如 ps aux —sort=-%CPU 按 CPU 占用降序排列,快速找 “吃 CPU” 的进程);
  • 按用户筛选进程(如 ps aux | grep vagrant 查看普通用户 vagrant 启动的所有进程)。

实用技巧:按资源排序

通过 GNU 风格的 —sort 选项,可让 ps aux 按 CPU 或内存占用排序,避免手动 grep 筛选:

# 按 CPU 占用降序排列(%CPU 从高到低)
ps aux --sort=-%CPU

# 按内存占用降序排列(%MEM 从高到低)
ps aux --sort=-%MEM

3. GNU 风格:ps —forest(进程树与层级关系)

GNU 风格的 —forest 选项是 “可视化进程父子关系” 的利器,它会用 “竖线 + 横线” 绘制进程树,清晰展示哪些进程是 “父进程”,哪些是 “子进程”,尤其适合排查 “进程衍生关系”(如 Nginx 的主进程与工作进程)。

命令格式(可与 Unix/BSD 风格组合):

# 结合 BSD 风格,用进程树显示所有进程
ps aux --forest

# 结合 Unix 风格,显示 Nginx 进程的层级关系
ps -ef --forest | grep nginx

示例输出(ps aux —forest 部分结果):

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       500  0.0  0.2 120000  4096 ?        Ss   08:05   0:00 nginx: master process /usr/sbin/nginx
www-data   501  0.0  0.1 120500  2048 ?        S    08:05   0:00  \_ nginx: worker process
www-data   502  0.0  0.1 120500  2048 ?        S    08:05   0:00  \_ nginx: worker process
vagrant   1000  0.0  0.3 150000  6144 pts/0    Ss   09:00   0:00 bash
vagrant   1234  5.0  2.0 200000 40960 pts/0    R+   09:30   0:10  \_ python3

解读:

  • nginx: master process(PID 500)是 “主进程”,下面两个 nginx: worker process(PID 501、502)是它的 “子进程”(用 _ 标识);
  • bash(PID 1000)是用户登录后的终端进程,python3(PID 1234)是在 bash 中启动的子进程,说明 python3 是通过终端命令启动的。

适用场景:

  • 排查 “进程簇” 关系(如查看 Tomcat 的主进程与子线程、Docker 容器进程的父进程);
  • 确认进程是否 “正确衍生”(如 Nginx 主进程是否成功启动工作进程)。

三、常用组合:ps 与 grep/awk 搭配筛选进程

日常使用中,ps 命令常与 grep(过滤关键词)、awk(提取字段)组合,实现 “精准筛选进程” 或 “提取关键信息” 的需求,以下是几个高频组合示例。

1. 查找指定进程(如 Nginx、Python)

# 查找 Nginx 相关进程(排除 grep 自身进程)
ps -ef | grep nginx | grep -v grep

# 查找 Python3 进程(BSD 风格,显示资源占用)
ps aux | grep python3 | grep -v grep
  • 加 grep -v grep 是为了排除 “grep nginx” 这个临时进程(避免结果中出现无关的 grep —color=auto nginx 条目)。

2. 提取指定进程的 PID(用于 kill 或监控)

# 提取 Nginx 主进程的 PID(用 awk 取第 2 列,即 PID 列)
ps -ef | grep "nginx: master process" | grep -v grep | awk '{print $2}'

# 将 PID 赋值给变量,用于后续 kill 操作
NGINX_PID=$(ps -ef | grep "nginx: master process" | grep -v grep | awk '{print $2}')
kill -HUP $NGINX_PID  # 平滑重启 Nginx

3. 查看指定用户的所有进程

# 查看用户 vagrant 启动的所有进程(Unix 风格)
ps -ef | grep vagrant | grep -v grep

# 查看用户 root 的进程(BSD 风格,显示资源占用)
ps aux | grep ^root | grep -v grep
  • grep ^root 中的 ^ 表示 “以 root 开头”,确保只匹配 USER 字段为 root 的进程,避免匹配到命令中包含 root 的进程。

四、总结:ps 命令的核心使用场景与选型

ps 命令的灵活性体现在 “不同选项风格适配不同需求”,无需死记所有命令,只需根据实际场景选择对应的高频组合即可。以下是日常运维 / 开发中最常见的场景与最优命令搭配,直接套用就能高效解决问题:

核心需求推荐命令选型理由
1. 查看系统所有进程,追溯父子关系ps -efUnix 风格经典命令,完整展示 PID(进程 ID)、PPID(父进程 ID),方便排查 “某个进程由谁启动”,是运维定位进程来源的首选
2. 快速定位高 CPU / 内存占用进程ps aux —sort=-%CPU(按 CPU 排序)|ps aux —sort=-%MEM(按内存排序)BSD 风格的 aux 自带 % CPU、% MEM 字段,直观显示资源占用;结合 GNU 风格的 —sort 选项,无需手动筛选,直接按资源消耗降序排列,秒找 “资源大户”
3. 可视化查看进程层级(如服务主 / 子进程)ps aux —forest(全局进程树)ps -ef —forest | grep 服务名(指定服务树)—forest 选项用 “竖线 + 下划线” 绘制进程树,清晰区分主进程与子进程(如 Nginx 主进程与工作进程、Docker 容器进程与父进程),适合确认服务是否正常衍生子进程
4. 查找指定进程并获取 PID(用于 kill / 重启)ps -ef | grep “关键词” | grep -v grep | awk ‘{print $2}’组合 grep 过滤关键词(如进程名、启动命令),grep -v grep 排除临时筛选进程,awk 提取 PID 列,可直接赋值给变量用于后续操作(如 kill $PID 关闭进程)
5. 查看指定用户的所有进程(如普通用户 /root)ps aux | grep ^用户名(如 ps aux | grep ^vagrant)BSD 风格的 aux 以 USER 字段开头,grep ^用户名 精准匹配该用户的所有进程,避免命令中包含用户名的无关结果,适合排查 “某用户启动了哪些进程”

总之,ps 命令的核心是 “按需筛选信息”:

  • 关注进程关系用 ps -ef,关注资源占用用 ps aux,关注层级结构加 —forest;
  • 复杂需求(如筛选、提取 PID)只需搭配 grep/awk,就能让进程信息从 “杂乱输出” 变成 “精准结果”。