ps -aux 和 ps -ef 都是 Linux 系统中用来查看进程信息的命令,但它们来自不同的历史渊源(BSD 风格 vs System V 风格),在输出格式、语法细节和显示内容上有一些区别。
一、直观对比(先看输出差异)
| 对比项 | ps -aux | ps -ef |
|---|---|---|
| 风格 | BSD 风格 | System V 风格 |
| 命令来源 | 来源于 BSD Unix | 来源于 AT&T Unix |
| 常见系统 | Linux、FreeBSD、macOS | Linux、Solaris、AIX |
| 输出格式 | 11列(USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND) | 8列(UID, PID, PPID, C, STIME, TTY, TIME, CMD) |
| 关键信息 | 包含 CPU 和内存使用率(%CPU, %MEM) | 包含父进程 ID(PPID) |
| 语法细节 | -aux 中的 - 可以省略(通常写成 ps aux) | -ef 中的 - 必须保留,否则意义不同(ps ef 是显示进程树) |
二、详细解析
1. ps -aux(或 ps aux)
- 含义:显示所有用户的所有进程,附带 CPU 和内存使用率。
- 常用场景:
- 想快速找到CPU或内存占用最高的进程(配合
--sort使用)。 - 需要看进程的状态 STAT(如
R运行、S休眠、Z僵尸)。 - 系统性能排查时常用。
示例输出片段:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 128160 6944 ? Ss 10:15 0:02 /usr/lib/systemd/systemd
mysql 1234 5.0 10.2 1620000 102400 ? Sl 10:16 1:30 /usr/sbin/mysqld
关键列解读:
%CPU:CPU 使用率%MEM:内存使用率STAT:进程状态(Ss表示休眠的会话领导者,R表示运行,Z表示僵尸)VSZ:虚拟内存大小RSS:物理内存大小
2. ps -ef
- 含义:显示所有进程的完整信息,重点是进程之间的父子关系。
- 常用场景:
- 需要查看父进程 ID(PPID),比如找出某个进程是谁启动的。
- 排查僵尸进程的父进程。
- 兼容性好,几乎所有 Unix/Linux 系统都支持。
示例输出片段:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:15 ? 00:00:02 /usr/lib/systemd/systemd
root 1234 1 5 10:16 ? 00:01:30 /usr/sbin/mysqld
关键列解读:
PPID:父进程 ID(比如上面 MySQL 的 PPID 是 1,说明它由 systemd 启动)C:CPU 使用率(和%CPU类似,但通常只显示整数)STIME:启动时间TIME:累计 CPU 时间
三、实际工作中怎么选?
| 需求场景 | 推荐命令 | 原因 |
|---|---|---|
| 想看 CPU/内存占用 | ps aux | 直接显示 %CPU 和 %MEM |
| 想看进程树/父子关系 | ps -ef | 直接显示 PPID |
| 想杀僵尸进程 | ps -ef | 需要知道僵尸进程的父进程是谁 |
| 想快速定位高资源进程 | ps aux --sort=-%cpu | head | 按 CPU 排序 |
| 想查看完整命令行 | ps aux 或 ps -ef | 两者最后一列都是 COMMAND/CMD |
| 写脚本时通用性 | ps -ef | 几乎所有 Unix 变种都支持 |
四、容易踩的坑
1. 不要把 ps aux 写成 ps -aux(虽然现在能兼容)
在 POSIX 标准中,ps -aux 的意思是显示用户名为 “x” 的进程,如果不存在用户 x,则打印错误。但大多数 Linux 发行版为了兼容性,把 ps -aux 也解释为 ps aux。
最佳实践:直接写 ps aux,不要加 -。
2. ps ef ≠ ps -ef
ps -ef:显示所有进程ps ef:显示进程树(e 表示所有进程,f 表示 forest 树状格式)
3. 想在 ps -ef 里看 CPU 占用怎么办?
ps -eo pid,ppid,%cpu,%mem,cmd # 自定义输出格式
或者直接用 ps aux。
五、一句话总结
ps aux:适合监控资源,给你 CPU、内存、状态。ps -ef:适合追踪关系,给你父进程 ID。
发表回复