ps 默认只显示当前终端进程,需加 -e 或 -a 查看全系统进程;ps -ef(system v 风格)字段固定、cmd 不截断但无资源占比,ps aux(bsd 风格)含 %cpu/%mem 但 command 默认截断。

ps 默认只显示当前终端的进程,想看全系统进程必须加 -e 或 -A 参数,否则你会漏掉 90% 的关键进程。
ps -ef 和 ps aux 的区别到底在哪
这两个是最常用但最容易混淆的组合:
-
ps -ef是 System V 风格,输出字段固定:UID、PID、PPID、C、STIME、TTY、TIME、CMD;CMD列不截断,适合看完整命令行,但不显示 CPU/内存百分比 -
ps aux是 BSD 风格,u表示用户视角,x包含无终端的进程(如守护进程),字段含%CPU、%MEM、VSZ、RSS;但COMMAND列默认截断,长命令会显示不全 - 两者都支持管道过滤,比如
ps aux | grep nginx,但注意grep自身也会出现在结果里,可用ps aux | grep [n]ginx规避
如何精准定位某个进程的 PID
靠肉眼翻页找 PID 效率极低,直接用 pgrep 更可靠,但 ps 也能做到:
- 按进程名模糊匹配:
ps -ef | grep "python.*data"—— 注意用引号包裹含空格或特殊字符的模式 - 只输出 PID 列:
ps -C nginx -o pid=(-C精确匹配可执行名,-o pid=去掉表头) - 查子进程:
ps --ppid 1234(1234 是父进程 PID),比ps -ef | awk '$3==1234'更简洁安全 - 避免误杀:
ps -o pid,comm,args -C java同时看 PID、二进制名和完整参数,确认是不是你要的那个 Java 进程
ps 输出字段中哪些真正有用
新手常被一堆缩写搞晕,实际高频关注的就这几个:
-
PID:进程 ID,杀进程前必核对 -
PPID:父进程 ID,排查孤儿进程或服务启动链时关键 -
STAT:状态码,R(运行中)、S(休眠)、Z(僵尸)必须立刻识别;表示高优先级,<code>N表示低优先级 -
TIME:CPU 使用总时间(非百分比),判断是否长期霸占 CPU 很有效 -
TTY:关联终端,?表示无终端(典型后台服务),pts/0表示某次 SSH 登录
别迷信 ps 的实时性——它只是一次快照,进程可能在你敲完命令前就结束了;需要持续观察用 top 或 htop,要分析历史资源占用得靠 /proc/[pid]/stat 或 pidstat。另外,容器环境里 ps 显示的是宿主机视角,进容器后看到的 PID 可能和宿主机不一致,这点很容易被忽略。











