ps 命令用于显示当前系统进程的瞬时快照。它不是持续监控工具,而是执行瞬间读取进程状态并打印出来。掌握几个常用参数组合,能让你快速定位问题进程、查看资源占用或理解进程间父子关系。
1. 查看所有用户的所有进程
BSD 风格(最常用):
ps aux
a:显示所有终端用户(包括其他用户)的进程u:以用户友好的格式显示,包含 CPU、内存使用率x:不限制于有控制终端的进程,显示后台守护进程
输出列:USER(进程所有者)、PID(进程ID)、%CPU、%MEM、VSZ(虚拟内存大小)、RSS(物理内存驻留大小)、TTY(终端)、STAT(进程状态)、START(启动时间)、TIME(累计CPU时间)、COMMAND(命令行)
Unix 风格(同样常用):
ps -ef
-e:显示所有进程-f:全格式,显示父进程ID(PPID)等
输出列:UID、PID、PPID、C(CPU占用)、STIME(启动时间)、TTY、TIME、CMD
这两种风格任选其一,都能快速列出全部进程。ps aux 更侧重资源消耗,ps -ef 更侧重进程层级。
2. 按名称过滤进程
ps aux | grep nginx
ps -ef | grep sshd
结合 grep 过滤出感兴趣的服务进程。grep 本身也会出现在结果中(因为 grep 进程命令行里包含搜索词),这是正常现象,可以追加 | grep -v grep 排除。
或者直接使用 pgrep 命令获得简洁的 PID 列表:
pgrep -a nginx # -a 同时显示进程名和 PID
3. 显示进程树
ps auxf
ps -ejH
ps axjf # 以树状图查看父子关系
f 或 H 参数会以 ASCII 树形结构展示父进程与子进程的嵌套关系,非常适合排查某个服务 fork 出了多少子进程,或追踪孤儿进程的源头。
4. 自定义输出列(极为实用)
当你只关心特定的进程属性时,使用 -o 参数可以定制输出,减少无关信息:
ps -eo pid,ppid,user,%cpu,%mem,comm --sort=-%cpu | head -20
-eo:指定显示的列(如 pid, ppid, user, comm, %cpu 等)--sort=-%cpu:按 CPU 使用率降序排列(-表示降序)- 常见列名:
pid、ppid、user、%cpu、%mem、rss、vsz、stat、start、time、comm(仅命令名)、args(完整命令行)
这种高度自定义的方式使 ps 可以替代许多监控脚本中的多次过滤,一条命令直接输出需要的数据。
5. 查看特定进程的详细信息
如果你知道 PID(例如 1234),可以直接查询:
ps -p 1234 -f # Unix 风格全格式
ps -p 1234 u # BSD 风格详细
ps -p 1234 -o pid,ppid,user,stat,args # 自定义输出
也可以用 /proc/1234/ 文件系统来获取更多细节,但 ps 是最快捷的摘要方式。
6. 检查某个程序的所有实例
ps -C nginx -o pid,user,%cpu,%mem,args
-C 直接按命令名(comm 字段)筛选,比 grep 更精确,且不需要担心过滤 grep 自身。
实用总结
- 日常巡检:
ps aux或ps -ef - 排查 CPU/内存消耗大户:
ps aux --sort=-%cpu | head -10 - 追踪进程父子关系:
ps axjf或ps auxf - 脚本中提取进程数据:
ps -eo自定义列 - 精确找一个程序:
ps -C 进程名 -o 所需字段
ps 是所有进程管理操作的基础,配合 top/htop 的动态监控和 pidstat 的资源明细,组成完整的进程诊断工具箱。记住,ps 是“拍照”,top 是“录像”,根据需求选择工具。