一、概述
ps 是 Process Status 的缩写,用于输出当前系统进程的快照信息。它是 Linux 系统中最基本且最强大的进程查看命令,可以用来确定哪些进程正在运行、进程的运行状态、是否存在僵尸进程、哪些进程占用资源过多等-。
注意 :
ps显示的是执行瞬间的进程状态快照,不会动态更新。如需实时监控进程,应使用top命令。
bash
ps --help a
用法:
ps [选项]
基本选项:
-A, -e all processes
-a all with tty, except session leaders
a all with tty, including other users
-d all except session leaders
-N, --deselect negate selection
r only running processes
T all processes on this terminal
x processes without controlling ttys
Selection by list:
-C <命令> 命令名称
-G, --Group <GID> real group id or name
-g, --group <group> session or effective group name
-p, p, --pid <PID> 进程编号
--ppid <PID> 父进程编号
-q, q, --quick-pid <PID>
process id (quick mode)
-s, --sid <session> session id
-t, t, --tty <tty> 终端
-u, U, --user <UID> effective user id or name
-U, --User <UID> 真实用户编号或名称
The selection options take as their argument either:
a comma-separated list e.g. '-u root,nobody' or
a blank-separated list e.g. '-p 123 4567'
输出格式:
-D <format> date format for lstart
-F extra full
-f 完整格式,包含命令行
f, --forest ascii 字符艺术显示的进程树
-H show process hierarchy
-j jobs format
j BSD 任务控制格式
-l 长格式
l BSD 长格式
-M, Z 添加安全数据(用于 SELinux)
-O <format> preloaded with default columns
O <format> as -O, with BSD personality
-o, o, --format <格式>
用户定义的格式
-P add psr column
s 信号格式
u user-oriented format
v 虚拟内存格式
X 寄存器格式
-y do not show flags, show rss vs. addr (used with -l)
--context 显示安全上下文(用于 SELinux)
--headers repeat header lines, one per page
--no-headers do not print header at all
--cols, --columns, --width <num>
set screen width
--rows, --lines <num>
set screen height
--signames display signal masks using signal names
Show threads:
H as if they were processes
-L possibly with LWP and NLWP columns
-m, m after processes
-T possibly with SPID column
Miscellaneous options:
-c show scheduling class with -l option
c show true command name
e show the environment after command
k, --sort specify sort order as: [+|-]key[,[+|-]key[,...]]
L show format specifiers
n display numeric uid and wchan
S, --cumulative include some dead child process data
-y do not show flags, show rss (only with -l)
-V, V, --version display version information and exit
-w, w 不限制输出宽度
--help <simple|list|output|threads|misc|all>
--help <s|l|o|t|m|a>
显示帮助信息并退出
二、选项的三种风格
ps 命令支持三种不同风格的选项,它们可以混合使用,但为避免冲突,建议保持一致:
| 风格 | 格式 | 示例 |
|---|---|---|
| UNIX 风格 | 前面加一个短横线 -,可分组 |
ps -ef |
| BSD 风格 | 不加短横线,可分组 | ps aux |
| GNU 长选项 | 前面加两个短横线 -- |
ps --sort |
三、最常用的命令组合
1. ps aux ------ BSD 风格,显示所有进程的详细信息
bash
ps aux
这是最常用的组合之一:
-
a:显示所有用户的进程-
-
u:以用户为中心格式输出,显示 CPU/内存占用百分比
-
x:显示没有控制终端的进程(如守护进程)
2. ps -ef ------ UNIX 风格,显示所有进程的完整格式
bash
ps -ef
-
-e :显示所有进程(等同于
-A) -
-f:完整格式输出,显示更多字段信息
3. 两者区别
| 特点 | ps aux |
ps -ef |
|---|---|---|
| 风格 | BSD | UNIX |
| 特点 | 显示 CPU/内存占用百分比 | 显示父进程 ID (PPID) |
| 适用场景 | 查看资源占用情况 | 查看进程父子关系 |
四、输出字段详解
ps aux 输出字段
| 字段 | 含义 |
|---|---|
| USER | 运行该进程的用户 |
| PID | 进程 ID |
| %CPU | CPU 使用率百分比 |
| %MEM | 物理内存使用率百分比 |
| VSZ | 虚拟内存大小(KB) |
| RSS | 实际物理内存大小(KB) |
| TTY | 控制终端名称(? 表示无终端) |
| STAT | 进程状态(见下方说明) |
| START | 进程启动时间 |
| TIME | 累计占用 CPU 时间 |
| COMMAND | 启动进程的命令 |
ps -ef 输出字段
| 字段 | 含义 |
|---|---|
| UID | 用户 ID |
| PID | 进程 ID |
| PPID | 父进程 ID |
| C | CPU 调度优先级因子 |
| STIME | 进程启动时间 |
| TTY | 完整终端名称 |
| TIME | 累计 CPU 时间 |
| CMD | 完整命令和参数 |
进程状态码 (STAT)
| 状态 | 含义 |
|---|---|
| R | 正在运行或可运行(在运行队列中) |
| S | 可中断的睡眠(等待事件完成) |
| D | 不可中断的睡眠(通常与硬件 I/O 相关) |
| Z | 僵尸进程(已终止但未被父进程回收) |
| T | 被信号暂停或停止 |
| s | 包含子进程(会话首进程) |
| + | 位于前台进程组 |
五、高级技巧与场景化应用
1. 查看进程树
bash
ps -ejH # UNIX 风格
ps axjf # BSD 风格[reference:26][reference:27]
j 显示作业控制信息,-H 以树状结构展示进程层级
2. 查看线程信息
bash
ps -eLf # 显示所有进程的线程信息
ps axms # BSD 风格
# 查看该进程的内存占用详情 (VSZ是虚拟内存,RSS是物理内存)
ps -p {$pid} -o pid,vsz,rss,cmd
# 查看该进程下所有线程的CPU和内存使用情况
ps -eLf | grep {$pid}
-L 会显示 LWP(轻量级进程/线程)列。
3. 按 CPU 或内存排序
bash
# 按 CPU 使用率降序排列,显示前 10 个
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -10
# 按内存使用量排序
ps --sort size
-o 用于自定义输出字段,--sort=-%cpu 中的 - 表示降序排列。
4. 查看特定用户的进程
bash
ps -u username # 查看指定用户的进程
ps -U root -u root u # 查看以 root 身份运行的所有进程
5. 按进程名筛选
bash
ps -C syslogd -o pid= # 仅打印 syslogd 的 PID
ps -C nginx -o pid,cmd # 查看 nginx 的 PID 和命令
6. 查找僵尸进程
bash
ps -A -ostat,pid | grep -e '^[Zz]'
通过状态字段筛选出僵尸进程,然后可以用 kill -9 PPID 终止其父进程来回收资源。
7. 显示完整命令(不截断)
默认情况下,ps 会截断超过 80 列的命令行。使用 ww 选项可以显示完整命令:
bash
ps auxww # 显示所有进程的完整命令
ps -p 12345 -ww # 查看指定 PID 的完整命令
8. 自定义输出格式
bash
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
ps -o ppid= -p 12345 # 仅获取某进程的 PPID
-o 后面跟以逗号或空格分隔的字段列表,可重命名列标题-。
9. 过滤时排除 grep 自身
bash
ps aux | grep '[h]ttpd' # 使用方括号技巧排除 grep 自身
ps aux | grep httpd | grep -v grep
六、实用技巧总结
| 需求 | 命令 |
|---|---|
| 查看所有进程(最常用) | ps aux 或 ps -ef |
| 查看进程树 | ps axjf 或 ps -ejH |
| 查看线程 | ps -eLf |
| 按 CPU 排序 | ps -eo pid,cmd,%cpu --sort=-%cpu |
| 按内存排序 | ps -eo pid,cmd,%mem --sort=-%mem |
| 查看特定用户 | ps -u username |
| 按进程名查找 | ps -C process_name |
| 显示完整命令 | ps auxww |
| 查找僵尸进程 | `ps -A -ostat,pid |
| 自定义输出 | ps -o pid,user,command |
ps 命令参数繁多,日常使用中掌握上述组合已能覆盖绝大多数场景。详细用法可参考 man p。