ps 的全称是 Process Status(进程状态),它的主要作用是实时查看当前系统中正在运行的进程,你可以把它想象成系统的一个“快照”,告诉你在某一时刻,系统里有哪些进程在运行,它们的状态、资源占用情况等。

基本用法(最常用)
ps 命令有很多选项,最常用的是不带任何选项的 ps。
ps
在不同 Unix 系统上(如 macOS 和 Linux),不带选项的 ps 输出格式略有不同。
在 macOS/BSD 系统上
输出通常是:
PID TTY TIME CMD
12345 ttys000 0:00.01 -zsh
67890 ttys001 0:00.02 bash
- PID: 进程 ID (Process ID),每个进程的唯一标识符。
- TTY: 终端类型,表示进程在哪个终端上运行。 表示没有关联终端(通常是后台服务)。
- TIME: 进程自启动以来占用的 CPU 总时间。
- CMD: 启动进程的命令名称。
在 Linux 系统上
输出通常是:

PID TTY TIME CMD
12345 pts/0 00:00:01 zsh
67890 pts/1 00:00:00 bash
格式类似,但 TTY 的命名方式不同。
小结:不带选项的 ps 只能看到与你当前终端相关的、少数几个进程,对于系统管理来说,这远远不够。
常用选项和组合
ps 的真正威力在于它的选项,最常用、最强大的组合是 aux。
ps aux (Linux/BSD 通用)
这是查看所有进程最经典、最常用的命令。

ps aux
a: 显示所有终端的进程,包括其他用户的进程。u: 以用户为中心的格式显示,显示用户名、CPU 及内存使用率等。x: 显示通常没有控制终端的进程(即守护进程/daemon,如sshd,httpd)。
输出示例 (Linux):
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 12800 8164 ? Ss 05:30 0:01 /usr/lib/systemd/systemd --switch-root --system
root 2 0.0 0.0 0 0 ? S 05:30 0:00 [kthreadd]
root 10 0.0 0.0 0 0 ? S< 05:30 0:00 [rcu_gp]
root 11 0.0 0.0 0 0 ? S< 05:30 0:00 [rcu_par_gp]
...
myuser 1234 0.5 2.1 456789 123456 ? Sl 10:15 0:30 /usr/lib/firefox/firefox
nobody 5678 0.1 0.5 89012 34567 ? S 10:20 0:05 /usr/sbin/nginx -g daemon on;
...
重要列解释:
- USER: 进程所有者。
- PID: 进程 ID。
- %CPU: 进程占用 CPU 的时间百分比。
- %MEM: 进程占用物理内存的百分比。
- VSZ: Virtual Memory Size (虚拟内存大小),进程占用的虚拟内存总量。
- RSS: Resident Set Size (常驻内存集大小),进程占用的物理内存总量。
- TTY: 终端。
- STAT: 进程状态。
R: Running (正在运行)S: Sleeping (可中断睡眠,等待某个事件)D: Uninterruptible Sleep (不可中断睡眠,通常在 I/O 操作)Z: Zombie (僵尸进程,已结束但父进程未回收)T: Stopped (已停止)s: 是一个会话领导者l: 多线程- 前台进程组
- START: 进程启动的时间。
- TIME: 进程累计使用的 CPU 时间。
- COMMAND: 启动进程的完整命令。
ps -ef (Unix/Linux 通用)
这是另一个查看所有进程的经典组合,尤其在 Solaris、AIX 等传统 Unix 系统上非常普遍。
ps -ef
-e: 显示所有进程。-f: 以完整的格式显示(full format)。
输出示例 (Linux):
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 05:30 ? 00:00:01 /usr/lib/systemd/systemd --switch-root --system
root 2 0 0 05:30 ? 00:00:00 [kthreadd]
...
myuser 1234 1 0 10:15 pts/0 00:00:30 /usr/lib/firefox/firefox
nobody 5678 1 0 10:20 ? 00:00:05 nginx: master process nginx -g daemon on;
...
重要列解释:
- UID: 用户 ID。
- PID: 进程 ID。
- PPID: Parent PID (父进程 ID),这是
ps -ef和ps aux一个关键区别,可以方便地追踪进程的父子关系。 - C: CPU 使用率。
- STIME: 进程启动的时间。
- CMD: 启动进程的命令。
进阶用法
只显示特定进程
通常我们不想看所有进程,而是想找某个特定的进程,这时可以使用 grep。
# 查找名为 'sshd' 的所有进程 ps aux | grep sshd # 查找包含 'java' 关键字的进程 ps aux | grep java
技巧: grep 进程本身也会出现在结果中,可以用下面的命令来过滤掉 grep 自身:
ps aux | grep [s]shd # 或者 ps aux | grep sshd | grep -v grep
使用 ps 查看进程树
ps 本身不直接显示树状结构,但可以通过组合 ps 和 grep 来模拟。
# 显示以 PID 1 (systemd) 为根的进程树 ps -ef --forest | grep '^[^ ]* *1 ' # 或者使用更通用的方法,显示某个进程及其子进程 ps -ef --forest | grep 'sshd'
--forest 选项会让输出以树状结构显示, 符号表示父子关系。
使用 ps 查找占用资源最多的进程
ps aux 的输出非常适合用 sort 命令进行排序。
# 按内存占用率降序排列,显示前10个进程 ps aux --sort=-%mem | head -n 11 # 按CPU占用率降序排列,显示前10个进程 ps aux --sort=-%cpu | head -n 11
--sort=-%mem 表示按 %MEM 列进行降序排序。head -n 11 是因为 ps aux 的第一行是标题行,所以需要显示 11 行才能看到 10 个进程。
现代替代品:top 和 htop
虽然 ps 非常重要,但在实际运维中,人们更常使用 top 和 htop。
top: 一个动态的、全屏的进程监视器,它会每隔几秒刷新一次,让你实时看到进程状态的变化。htop:top的一个增强版,界面更美观,操作更直观(可以用鼠标选择进程,按F9直接杀死进程),并且默认以树状结构显示进程。
htop 通常需要额外安装,但一旦使用,很多人就离不开它了。
| 命令 | 功能 | 优点 | 缺点 |
|---|---|---|---|
ps |
查看当前终端的进程 | 快速,无需选项 | 信息有限 |
ps aux |
查看所有进程(Linux风格) | 信息全面,格式友好 | 输出多,需要管道处理 |
ps -ef |
查看所有进程(Unix风格) | 标准通用,有PPID列 | 格式略显紧凑 |
top |
实时动态监视所有进程 | 实时,交互式(可排序、杀死进程) | 界面相对简单 |
htop |
实时动态监视所有进程 | 界面美观,交互性强,默认树状结构 | 需要额外安装 |
核心建议:
ps aux和ps -ef,它们是查看静态进程列表的基石。- 学会用
grep过滤,这是ps最常见的用法。 - 了解
top和htop,当你需要持续监控时,它们是更好的选择。
