Linux 命令工具 ps
与 pstree
详解
一、ps 工具概述
ps
(Process Status)是 Linux 系统中用于查看当前进程状态的核心工具,可显示进程的 PID、用户、CPU 占用率、内存使用量、启动时间、命令行参数等信息。
- 应用场景:监控系统性能、排查进程异常、管理后台服务等。
- 数据来源:直接读取
/proc
文件系统(存储运行中进程的实时信息)。
二、ps 安装方式
ps
是 Linux 系统的内置工具,无需手动安装,默认随系统预装。
- 验证安装:在终端输入
ps --version
或ps -V
,若显示版本信息(如ps (GNU ps) 3.3.17
),则说明已安装。
三、ps 核心功能
功能 | 说明 |
---|---|
查看进程列表 | 显示当前用户或所有用户的进程,支持按 PID、CPU、内存等排序。 |
过滤进程 | 通过进程名、用户、状态等条件筛选特定进程(如仅显示某用户的进程)。 |
获取进程细节 | 显示进程的父进程 PID(PPID)、启动时间、命令行参数、资源占用等详细信息。 |
监控实时状态 | 配合 watch 命令动态刷新进程状态(如 watch -n 2 ps aux )。 |
四、ps 基础用法
1. 常用选项组合
-
ps aux
(BSD 风格,适用于查看所有用户的进程):a
:显示终端中的所有进程(包括其他用户)。u
:以用户格式显示(包含用户名、CPU、内存等详细信息)。x
:显示无终端的进程(如后台服务)。
输出字段说明:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 16964 3432 ? Ss May20 0:06 /sbin/init
USER
:进程所属用户;PID
:进程 ID;%CPU
:CPU 占用率;%MEM
:内存占用率;COMMAND
:进程启动命令。
-
ps -ef
(System V 风格,适用于查看进程父子关系):-e
:等价于a
,显示所有进程;-f
:显示完整格式(包含父进程 PPID、启动时间等)。
典型输出:
UID PID PPID C STIME TTY TIME CMD root 1 0 0 May20 ? 00:00:06 /sbin/init
PPID
:父进程 ID;STIME
:进程启动时间。
2. 过滤特定进程
- 按进程名过滤(使用
grep
):ps aux | grep nginx # 查看 nginx 相关进程 ps -ef | grep [p]ython # 精确匹配 python 进程(避免包含 grep 自身)
- 按用户过滤:
ps -u username # 显示用户 username 的进程 ps -u root -u www-data # 显示 root 和 www-data 用户的进程
- 按 PID 过滤:
ps -p 1234 # 查看 PID 为 1234 的进程详情
五、ps 进阶操作
1. 排序与筛选
- 按 CPU 占用率降序排序:
ps aux --sort=-%cpu # 等价于 ps aux | sort -k3nr
- 按内存占用率降序排序:
ps aux --sort=-%mem
- 筛选特定状态的进程(如僵尸进程
Z
):ps aux | grep ' Z '
2. 获取进程树结构
结合 pstree
(下文详述)或 ps
自身参数查看进程父子关系:
ps -e -o pid,ppid,comm # 显示 PID、PPID、进程名
3. 输出格式化
使用 -o
自定义输出字段:
ps -o pid,user,%cpu,cmd # 仅显示 PID、用户、CPU 占用率、命令
ps -o pid,comm --sort=pid # 按 PID 排序并显示 PID 和进程名
六、实战案例
案例 1:杀死异常进程
- 查找占用 CPU 过高的进程:
ps aux | sort -k3nr | head -n 5 # 查看 CPU 占用前 5 的进程
- 终止进程(如 PID 为 12345):
kill -9 12345
案例 2:监控服务启动状态
跟踪 tomcat
进程的启动过程:
watch -n 1 "ps -ef | grep tomcat" # 每秒刷新一次 tomcat 进程状态
案例 3:分析内存泄漏
持续观察某进程的内存占用变化:
while true; do ps -p 6789 -o %mem; sleep 5; done
七、注意事项
- 选项兼容性:
ps
支持 BSD 风格(如aux
)和 System V 风格(如-ef
),不同风格选项不可混用(如ps -aux
合法,但ps -a -u -x
等价于ps aux
)。
- 动态性:
- 进程状态实时变化,
ps
输出仅为执行瞬间的快照,需结合top
等动态监控工具长期观察。
- 进程状态实时变化,
- 权限问题:
- 普通用户只能查看自己的进程,查看其他用户进程需
root
权限(如sudo ps -u root
)。
- 普通用户只能查看自己的进程,查看其他用户进程需
- 避免误操作:
- 使用
kill -9
强制终止进程前,需确认进程用途,避免终止关键系统服务(如init
进程)。
- 使用
pstree 命令补充
1. 工具概述
pstree
用于以树状结构显示进程的父子关系,直观展示进程启动链(如 init
作为所有进程的“根”)。
- 优势:比
ps -ef
更清晰呈现进程层次,适合排查服务依赖或僵尸进程链。
2. 安装方式
- 默认安装:多数 Linux 发行版(如 Ubuntu、CentOS)默认预装。
- 手动安装:
- Ubuntu/Debian:
sudo apt install psmisc
- CentOS/RHEL:
sudo yum install psmisc
- Ubuntu/Debian:
3. 核心功能与用法
- 基本用法:
典型输出:pstree # 显示以 init(PID=1)为根的进程树 pstree -u # 显示每个进程的所属用户 pstree -p # 显示每个进程的 PID
systemd(1)─┬─ModemManager(458)─┬─{ModemManager}(458) ├─accounts-daemon(636)───{accounts-daemon}(636) ├─agetty(1786) ├─bash(1785)───pstree(2001) └─sshd(937)─┬─sshd(1783)───bash(1784) └─{sshd}(937)
- 按 PID 或进程名过滤:
pstree 1234 # 显示 PID 为 1234 的进程及其子进程 pstree nginx # 显示 nginx 进程的树状结构
- 横向显示(适合宽屏):
pstree -H # 以横向层级展示进程树
4. 实战案例
- 案例:排查僵尸进程链
若发现僵尸进程(状态为Z
),使用pstree -p
定位其父进程,逐层终止:pstree -p | grep Z # 查找包含僵尸进程的分支 kill -9 父进程PID # 终止父进程以清理僵尸子进程
总结
ps
是进程查询的基础工具,通过不同选项组合可灵活获取进程信息;pstree
以可视化树状结构辅助分析进程关系,两者结合使用能更高效排查系统问题。
建议日常运维中配合top
(动态监控)、kill
(进程管理)等工具形成完整的进程管理流程。