ps是linux内置的posix标准进程查看命令,无需安装;默认仅显示当前终端下当前用户的进程,需加-e、-ef或aux等参数查看全部进程;stat字段标识进程状态(如r运行、s休眠、z僵尸),输出为静态快照,适合脚本调用而非实时监控。

ps 命令不需要安装——它是 POSIX 标准工具,所有 Linux 发行版默认自带,不存在「安装 ps」这回事。如果你在某个最小化系统(如 Alpine 容器、某些嵌入式镜像)里找不到 ps,那是因为它被精简掉了,不是你漏装了什么包。
ps 命令为什么总显示不全?
ps 默认只显示当前终端(tty)下由当前用户启动的进程,不带参数时输出极简:
PID TTY TIME CMD 1234 pts/0 00:00:00 bash 5678 pts/0 00:00:00 ps
这不是 bug,是设计行为。想看“所有进程”,必须显式加参数:
-
ps -e:列出系统中所有进程(不含完整格式) -
ps -ef:标准全量视图,含 PID、PPID、UID、启动时间、命令全路径等 -
ps aux:BSD 风格,a(all users)、u(user-oriented info)、x(no controlling tty),字段更贴近运维习惯(比如直接显示 %CPU、%MEM、VSZ、RSS)
注意:ps aux 和 ps -ef 输出字段顺序、含义略有差异,但核心信息一致。别纠结哪个“更正确”,选一个顺手的用就行。
ps 查特定进程时 grep 总多出自身
常见写法:ps aux | grep nginx
结果里总带一条 grep nginx 进程,干扰判断。
这不是 ps 的问题,是管道执行时 grep 自身已启动并被 ps 捕获。解决方法有两个:
用方括号绕过匹配:
ps aux | grep [n]ginx
因为[n]ginx不等于字面量nginx,grep进程名显示为grep [n]ginx,不会被自己匹配到改用
pgrep(更干净):pgrep -f nginx直接返回 PID;pgrep -af nginx显示 PID + 完整命令行
pgrep 是专用进程查找工具,比 ps | grep 更可靠,尤其在脚本中应优先使用。
ps 输出里的 STAT 字段到底代表什么?
ps 的 STAT 列(如 S、R、Z、、<code>N)是组合标志,单字母只是主状态,后面可能跟辅助标记。常见组合:
-
R:正在运行或可运行(runnable) -
S:休眠(sleeping),等待某事件(如 I/O、信号) -
Z:僵尸进程(zombie),子进程已终止但父进程未调用wait() :高优先级(nice <li> <code>N:低优先级(nice > 0)-
+:前台进程组成员
最常被忽略的是 Z:它不占资源,但积累太多说明有程序没正确回收子进程,长期运行的服务需警惕。
真正要排查卡死或异常,不能只盯 STAT,得结合 TIME(CPU 累计时间)、START(启动时刻)、COMMAND(是否截断)综合判断。
ps 的输出是快照,不是实时流;它不刷新、不排序、不自动过滤。想动态观察或按 CPU/内存排序,top 或 htop 才是正解。ps 的价值在于轻量、可脚本化、无依赖——适合写进监控检查、CI 脚本或容器健康探针里。











