ps aux列出全部进程,含用户、CPU、内存、状态,排查第一选择。
约 1327 字大约 4 分钟
2026-05-14
程序是磁盘上的文件,进程是它“跑起来”之后的样子。系统上同时有几百个进程在运行,排查问题时你需要能定位到具体某一个:它是谁启动的、用了多少资源、卡在什么状态。这篇建立的就是“看懂进程”的基础。
理解进程、PID、PPID、进程树的关系,看懂 ps 输出里的状态列,区分前台 / 后台进程和服务。
ps aux列出全部进程,含用户、CPU、内存、状态,排查第一选择。
ps -ef --forest以缩进树状展示父子关系,看清谁启动了谁。
pgrep -a nginx找出名字匹配的进程及其完整命令行。
pstree -p PID展开指定进程下的所有子进程,带 PID。
每个运行中的进程都有一个唯一编号 PID,还记录着启动它的父进程编号 PPID。顺着 PPID 往上追,所有进程最终都挂在 PID 为 1 的进程下(现代系统是 systemd)——整个系统就是一棵进程树。
ps -ef --forest # 缩进展示父子关系
pstree -p # 同样是树状,更紧凑这棵树在排查时很有用:一个失控的进程,看它的父进程往往就知道是谁拉起来的;杀掉父进程,子进程可能被一起带走,也可能变成“孤儿”被 PID 1 收养。
ps aux 的状态列ps aux 输出里有一列 STAT,是进程当前的状态:
| 状态 | 含义 | 排查提示 |
|---|---|---|
R | 正在运行或就绪 | 占 CPU 的多半是它 |
S | 可中断睡眠(等事件) | 最常见,正常 |
D | 不可中断睡眠(通常等 I/O) | 大量 D 状态 = I/O 出问题 |
Z | 僵尸进程 | 已结束但父进程没回收 |
T | 已停止(被信号暂停) | 被 Ctrl+Z 或 STOP 信号停住 |
D 和 Z 是两个值得警惕的信号。大片 D 状态通常指向磁盘或网络存储变慢(见 I/O 排查)。
进程结束后,会留下一个“退出状态”,等父进程用 wait 来读取并回收。如果父进程没做这件事,这个已结束的进程就停留为僵尸(Z)——它不占 CPU 和内存,只占一个 PID 条目。
关键点:僵尸进程杀不掉,因为它已经死了。要清掉它,得让它的父进程回收——通常是重启或修复那个有 bug 的父进程。少量僵尸无害,大量僵尸说明某个父进程写得有问题。
Ctrl+C 能中断它。&,或 Ctrl+Z 再 bg,不占终端——但它仍然属于你这个会话,你一关终端,它通常就被 SIGHUP 带走了。所以“我用 & 把程序丢后台了,怎么关了 SSH 它就没了”——因为后台进程不等于服务。要让程序长期独立运行,应该把它做成 systemd 服务(见 systemd 基础),而不是 & 加 nohup 凑合。
杀进程前先看清是谁
kill 之前务必用 ps、pgrep 确认 PID 对应的确实是你想杀的进程——PID 会被复用,你记下的那个号过一会儿可能已经是别的进程了。批量按名字杀(pkill)更要小心,名字匹配太宽可能误伤。具体怎么发信号见 信号与 kill。
| 误区 | 更稳妥的做法 |
|---|---|
试图 kill 掉僵尸进程 | 僵尸已死,杀不掉;要修复或重启它的父进程 |
用 & 加 nohup 让程序“常驻” | 那仍属于会话;要常驻就做成 systemd 服务 |
| 看到进程多就觉得有问题 | 先看 STAT 和资源占用,R/S 大量存在是正常的 |
| 凭印象记的 PID 直接拿来 kill | PID 会复用,动手前用 ps/pgrep 重新确认 |
版权归属:Shuo Liu