还在纠结 ps -aux 和 ps aux?一文搞懂 Linux里的流派恩怨
还在纠结 ps -aux 和 ps aux?一文搞懂 Linux里的流派恩怨
你在服务器上敲下 ps 命令查看进程时,是不是也有过这种困惑:明明参数都差不多,为什么有的命令前带 -,有的又不带?有时候想查个全进程列表,敲了 ps -aux 却感觉输出不太对劲,或者干脆报错?
别担心,这不怪你。这其实不是你学艺不精,而是 Linux 继承了两大豪门——UNIX(System V)和 BSD 的“血统”。这两个流派对命令行的语法设计有着根本性的分歧,而 ps 命令正是这种“流派恩怨”的最佳演示现场。
今天我们就来彻底扒一扒 ps 命令里那些让人头秃的语法细节,帮你把这几套逻辑梳理清楚,以后排障效率直接起飞。
一、 两座大山:UNIX 格式 vs BSD 格式
BSD 与 UNIX 两套语法的碰撞
在 Linux 的 ps 命令中,参数大体被分为两套阵营,理解这一点是解决混乱的关键。
1.UNIX 标准(System V)格式
这套风格通常被认为是“标准”写法,它的标志性特征就是:参数前面必须带一个连字符 -。
- 写法:
ps -ef,ps -u root,ps -e - 逻辑:这里的
-e代表 all processes(所有进程),-f代表 full-format(完整格式)。它讲究的是一种规范的、单字母选项的组合。
2. BSD 风格格式
这套风格源自伯克利软件套件(BSD),它的标志性特征是:参数前面通常不带连字符 -。
- 写法:
ps aux,ps ax,ps u - 逻辑:注意到了吗?没有那根横杠!当你敲
ps aux时,你实际上是在使用 BSD 风格。这里的a代表所有与终端相关的进程,u代表以用户为导向的显示格式,x代表通常不与终端关联的进程。
划重点:很多新手最容易犯错的地方就是觉得 BSD 风格“不太整齐”,非要给它加个横杠写成 ps -aux。在现代 Linux 系统中,为了容忍用户的“不严谨”,ps -aux 有时会被系统强行解释为 BSD 风格(甚至等同于 ps ax),但这实际上是一种“错误”的混写习惯,容易导致误解。
二、 为什么 -eu 输出的命令巨长?环境变量惹的祸
原文提到一个非常有意思的现象:同样是列进程,ps -aux 看起来一切正常,但 ps -eu 输出的 CMD 这一列却长得离谱,甚至满屏乱码。这究竟是为什么?
这里涉及到这两套语法中 “u” 参数定义的微小差异,以及环境变量的显示问题。
- 场景重现:
ps -e u:这实际上是 UNIX 风格的“选择器”-e(选所有进程) + BSD 风格的“格式化器”u(显示用户详细信息)。- 在 BSD 语法的定义中,
u参数不仅显示 CPU、内存利用率,默认还包括了该进程启动时的完整环境变量(Environment Variables)。 - 这就是为什么你在
ps -eu的输出中看到了类似USER=root PATH=/usr/bin... HOME=/root这一大坨东西。这并不是“巨长的命令”,而是命令后面附带的环境变量集合,导致输出列宽被极度拉长,毫无可读性。
解决方案: 如果你只是想看完整的命令行参数,但又不想看那一堆乱七八糟的环境变量,该怎么办?
不要只依赖 u 参数,可以显式指定宽度,或者改用 UNIX 的 -f 参数。
# 推荐用法:使用 UNIX 风格的完整格式
ps -ef
# 或者限制输出宽度,把环境变量截断掉(BSD风格混用)
ps -e u --width 100
三、 实战排雷:如何正确混搭两套语法?
既然有两套语法,能不能混着用?答案是可以的,但必须搞清楚顺序和规则。
ps 命令非常宽容,它允许你把 UNIX 参数和 BSD 参数组合起来写,但有一条铁律:
混用规则: 带连字符的(UNIX)放前面,不带连字符的(BSD)放后面。UNIX 风格的参数负责“选进程”,BSD 风格的参数负责“定格式”。
1. 典型的正确混用
ps -e u- 含义:用 UNIX 的
-e选择所有进程,用 BSD 的u决定以用户详细格式显示。 - 效果:你会看到包含 USER, PID, %CPU, %MEM 等详细列的列表。
- 含义:用 UNIX 的
2. 容易踩坑的错误混用
ps -ax- 你以为这是 UNIX 风格?不,在
ps的逻辑里,如果只写了-a,它还是 UNIX 逻辑;但x通常被视为 BSD 语法的一部分(不带横杠)。如果强行组合,某些旧系统会报错,或者行为不可预测。其实你大概率想写的是纯 BSD 的ps ax查看所有进程。
- 你以为这是 UNIX 风格?不,在
ps -aux- 如前所述,这是极其危险的写法。虽然不报错,但它的含义在不同系统下可能变化。最标准的写法应该是
ps aux(纯 BSD 风格查看所有用户进程),或者如果你想严格点,ps -e aux(查看所有进程 + BSD格式)。
- 如前所述,这是极其危险的写法。虽然不报错,但它的含义在不同系统下可能变化。最标准的写法应该是
四、 总结与建议
为了让你在以后的服务器运维中不再因为这几个字母抓狂,我总结了两个最佳实践建议:
-
如果你习惯“规范”: 彻底放弃不带横杠的写法。只使用
ps -ef(看全进程)或ps -u username(看指定用户)。这种写法最符合现代 Linux 标准,不容易混淆。 -
如果你追求“信息量”: 记住标准的 BSD 写法是
ps aux(注意没有横杠!)。它默认列出的 CPU、MEM、STAT 信息非常适合排查服务器负载高的问题。如果发现 CMD 列太长,配合less或grep使用:ps aux | grep nginx
搞懂这两套语法的“碰撞”,不仅是为了写出好看的命令,更是为了确保在生产环境故障排查时,能一眼看到你想看的数据,而不是被满屏的环境变量和奇怪的截断搞懵。希望这篇梳理能帮你填补上 Linux 学习路上的这个坑!

评论已关闭