Linux - 8 进程管理篇(ps、kill、pstree、top、netstate)
在 Linux 系统中,进程是程序运行的实例,是操作系统资源分配和调度的基本单位。Linux 作为多任务操作系统,支持同时运行多个进程,通过内核的进程管理机制实现高效调度。以下从核心概念、常用管理命令、进程状态等方面详细介绍 Linux 进程:
1. 进程的核心概念
PID:进程唯一标识符(Process ID),是区分不同进程的关键,由内核分配,取值范围一般为 1 - 65535,PID 会循环复用。
PPID:父进程 ID(Parent Process ID),每个进程(除了初始化进程)都由另一个进程创建,创建它的进程即为父进程。
初始化进程:系统启动后第一个进程,CentOS 6 及之前是 init(PID=1),CentOS 7+ 及 Ubuntu 等系统中是 systemd(PID=1),负责启动和管理其他系统进程。
进程类型:分为前台进程(与终端交互,需用户输入)和后台进程(无终端交互,在后台运行);还可分为系统进程(内核启动,管理系统资源)和用户进程(用户发起的程序运行实例)。
2. 进程的常见状态
| 状态标识 | 含义 |
|---|---|
| R(Running/Runnable) | 运行态,进程正在运行或处于就绪队列等待 CPU 调度 |
| S(Interruptible Sleep) | 可中断睡眠态,进程等待某个事件(如 I/O 完成),可被信号唤醒 |
| D(Uninterruptible Sleep) | 不可中断睡眠态,进程正在等待硬件相关操作,无法被信号唤醒,强行终止可能导致数据丢失 |
| Z(Zombie) | 僵尸态,子进程退出后,父进程未读取其退出状态,子进程残留的进程描述符未释放 |
| T(Stopped) | 停止态,进程被信号暂停(如 Ctrl+Z),可通过信号恢复运行 |
3. 常用进程管理命令
查看进程
ps:查看当前系统进程快照,常用参数组合:ps aux 显示系统所有进程(a:所有用户进程;u:显示进程所有者;x:显示无终端关联的进程);ps -ef 显示进程的父进程、PID 等详细信息,便于追踪进程关系。
top:实时动态查看进程状态,默认每 3 秒刷新一次。界面中可查看 CPU 使用率、内存使用率、进程排序等,按 k 可终止进程,按 q 退出。
pstree:以树形结构显示进程间的父子关系,直观呈现进程层级,例如 pstree -p 可同时显示 PID。
终止进程
kill:通过 PID 向进程发送信号,默认信号为 15(SIGTERM,友好终止,进程可清理资源)。例如 kill 1234 终止 PID 为 1234 的进程;若进程无法正常终止,可使用强制终止信号 9(SIGKILL),命令为 kill -9 1234。
pkill:通过进程名终止进程,例如 pkill firefox 终止所有火狐浏览器进程。
killall:与 pkill 类似,通过进程名终止进程,例如 killall nginx 终止所有 Nginx 进程。
进程优先级调整
Linux 进程优先级通过 nice 值 控制,范围为 -20 到 19。nice 值越小,优先级越高(获取 CPU 资源的概率越大),默认 nice 值为 0。nice 命令用于启动进程时设置优先级,例如 nice -5 ./test.sh 以 nice 值 -5 启动脚本;renice 命令用于调整运行中进程的优先级,例如 renice -10 1234 将 PID 1234 的进程 nice 值改为 -10。
4. 特殊进程处理
- 僵尸进程:若出现僵尸进程(状态为 Z),优先通过终止父进程的方式解决(父进程终止后,僵尸进程会被 systemd 接管并清理)。若父进程是核心进程,可重启相关服务。
- 后台进程控制:运行命令时加 & 可让进程后台运行,例如 ./test.sh &;通过 Ctrl+Z 可将前台进程暂停并转入后台;jobs 命令查看后台进程列表;fg %n 将第 n 个后台进程调回前台;bg %n 让第 n 个暂停的后台进程继续运行。
1)ps
ps(Process Status)是 Linux 中最核心的 进程查看命令,用于获取系统当前进程的“快照”(某一时刻的进程状态),而非实时动态监控(实时监控用 top)。它支持丰富的参数组合,能灵活筛选、展示进程信息,以下是 ps 命令的详细用法(含高频场景和参数解析):
一、ps 命令的核心语法

基本格式:
ps [选项]
Linux 中 ps 的选项分为三种风格(可混合使用):
- Unix 风格:以
-开头(如-ef) - BSD 风格:无
-开头(如aux) - GNU 风格:以
--开头(如--sort=-%cpu)
| 参数 | 风格 | 功能 |
|---|---|---|
a |
BSD | 显示所有用户的进程(含当前终端外的进程) |
u |
BSD | 显示进程所有者信息(USER、%CPU、%MEM 等) |
x |
BSD | 显示无终端关联的进程(后台进程、服务进程) |
-e |
Unix | 显示所有进程(同 a) |
-f |
Unix | 显示完整格式(含 PPID、UID 等) |
-l |
Unix | 显示长格式(含优先级 PRI、NI 等) |
-p PID |
通用 | 仅显示指定 PID 的进程 |
-t TTY |
通用 | 仅显示关联指定终端的进程(如 -t pts/0 显示远程终端 0 的进程) |
-u 用户 |
通用 | 仅显示指定用户的进程(如 -u root 显示 root 所有进程) |
--sort 字段 |
GNU | 按指定字段排序(-字段 降序,如 --sort=-%cpu) |
-L |
通用 | 显示进程的线程信息(LWP=线程 ID) |
二、最常用的 3 组参数组合
1. ps aux(BSD 风格,最常用,查看CPU占用率)
功能:显示系统中 所有用户的所有进程(包括无终端关联的后台进程),信息直观,适合快速查看进程状态。
ps aux #所有用户的所有进程
ps aux | less # 用less查看
ps aux | grep xxxx # 过滤
输出字段说明(重点关注红框部分):

| 字段 | 含义 |
|---|---|
| USER | 进程的所有者(用户名) |
| PID | 进程唯一 ID(终止进程、调整优先级的核心依据) |
| %CPU | 进程占用的 CPU 百分比(越高越耗 CPU) |
| %MEM | 进程占用的内存百分比(越高越耗内存) |
| VSZ | 进程虚拟内存大小(单位:KB) |
| RSS | 进程物理内存大小(单位:KB, 实际占用内存 ) |
| TTY | 进程关联的终端(? 表示无终端,后台进程;pts/0-255 表示远程终端,ttyl 是图形化终端,tty2-6 是本地字符界面终端) |
| STAT | 进程状态(如 R=运行、S=睡眠、Z=僵尸、T=暂停、s=包含子进程、l=多线程、+=前台线程,参考之前的进程状态表) |
| START | 进程启动时间(格式:时:分 或 月-日) |
| TIME | 进程累计占用的 CPU 时间(非运行时间,而是实际使用 CPU 的时长) |
| COMMAND | 启动进程的命令(含参数,[] 表示内核进程) |
示例:筛选占用 CPU 最高的前 5 个进程:
ps aux --sort=-%cpu | head -6 # --sort=-%cpu 按 CPU 降序排序,head -6 取前 5 个(含表头)
2. ps -ef(Unix 风格,适合追踪父子进程关系)
功能:显示所有进程的 完整信息,重点突出 父进程 PPID,便于追踪“谁启动了哪个进程”。
ps -ef
ps -ef | less
ps -ef | grep xxxx
输出字段说明(核心差异在 PPID 和 CMD):

| 字段 | 含义 |
|---|---|
| UID | 进程所有者的用户 ID(而非用户名,与 ps aux 的 USER 对应) |
| PID | 进程 ID |
| PPID | 父进程 ID(关键!通过它可找到进程的“上级”) |
| C | 进程占用的 CPU 百分比(与 ps aux 的 %CPU 类似) |
| STIME | 进程启动时间 |
| TTY | 关联终端(同 ps aux) |
| TIME | 累计 CPU 时间(同 ps aux) |
| CMD | 启动命令(不含完整路径,简洁版) |
示例:查找 nginx 进程的父进程:
ps -ef | grep nginx # 输出中 PPID 列即为 nginx 进程的父进程 ID
3. ps -l(查看当前终端的进程)
功能:仅显示 当前终端(你正在操作的终端) 相关的进程,信息更精简(适合查看自己启动的进程)。
ps -l
ps -l | less
ps -l | grep xxxx
输出字段说明(新增优先级相关字段):

| 字段 | 含义 |
|---|---|
| F | 进程标志(0=前台运行,1=后台运行,4=特权进程) |
| S | 进程状态(同 STAT) |
| UID | 所有者用户 ID |
| PID | 进程 ID |
| PPID | 父进程 ID |
| C | CPU 占用百分比 |
| PRI | 进程优先级(数值越小,优先级越高,内核动态调整) |
| NI | 进程 nice 值(-20~19,手动设置的优先级,与 PRI 相关) |
| ADDR | 进程内存地址(- 表示运行中) |
| SZ | 进程占用的内存大小(单位:页) |
| WCHAN | 进程等待的内核事件(- 表示运行中) |
| TTY | 关联终端(当前终端,如 pts/0) |
| TIME | 累计 CPU 时间 |
| CMD | 启动命令 |
三、高频场景:筛选与排序进程
1. 按进程名筛选(精准查找某类进程)
用 grep 配合 ps 过滤指定进程(如 nginx、mysql):
# 方法 1:ps aux + grep(显示完整信息)
ps aux | grep nginx
# 方法 2:ps -ef + grep(显示父进程关系)
ps -ef | grep mysql
# 排除 grep 自身(避免筛选结果中出现 grep 进程)
ps aux | grep [n]ginx # 用 [] 规避 grep 匹配自身
2. 按 PID 查找进程(精准定位单个进程)
已知 PID 时,查看该进程的详细信息:
ps -p 1234 # 1234 是目标 PID
ps aux | grep 1234 # 更详细的信息
ps -ef | grep -E '856|100597' #多个目标 PID

3. 按 CPU/内存排序(找出资源占用大户)
# 按 CPU 使用率降序排序(%cpu 降序)
ps aux --sort=-%cpu | head -10
# 按内存使用率降序排序(%mem 降序)
ps aux --sort=-%mem | head -10
# 按进程启动时间排序(START 升序,最早启动的在前)
ps aux --sort=START
4. 查看进程的线程信息
用 -L 选项显示进程的线程(轻量级进程):
ps -L aux | grep nginx # 显示 nginx 进程的所有线程(LWP 列是线程 ID)
进程状态表
| 状态标识 | 英文全称 | 核心含义 | 触发场景 / 说明 |
|---|---|---|---|
| R | Running / Runnable | 运行态:进程正在使用 CPU,或处于就绪队列等待 CPU 调度(内核就绪队列中) | 正常运行的进程(如 top 命令本身)、高 CPU 占用的进程(STAT 为 R 且 % CPU 高) |
| S | Interruptible Sleep | 可中断睡眠态:进程等待某个事件完成(如 I/O、信号),可被信号唤醒 | 绝大多数后台进程的默认状态(如 nginx 工作进程、sshd 空闲进程),% CPU 通常接近 0 |
| D | Uninterruptible Sleep | 不可中断睡眠态:进程正在等待硬件级操作(如磁盘 I/O、设备驱动响应),无法被信号唤醒 | 磁盘读写繁忙时(如 cp 大文件)、挂载网络磁盘超时,强行 kill -9 可能导致数据丢失 |
| Z | Zombie | 僵尸态:子进程已退出,但父进程未读取其退出状态(exit status),残留进程描述符 | 父进程未正确处理子进程退出(如程序 bug),ps 中显示 <defunct> 标识,需清理父进程 |
| T | Stopped / Traced | 停止态:进程被信号暂停,或被调试工具跟踪(如 gdb) |
1. 用户按 Ctrl+Z 暂停前台进程;2. 用 kill -19 暂停进程;3. gdb 调试时的跟踪状态 |
| X | Dead | 死亡态:进程已完全终止,资源(内存、PID)已被内核释放 | 瞬时状态,ps 无法捕获(仅内核内部标记,用户看不到) |
扩展状态
| 扩展标识 | 英文含义 | 核心作用 | 组合示例 |
|---|---|---|---|
| < | High Priority | 高优先级进程(nice 值 < 0,如 nice -5 ./test.sh),优先获取 CPU |
R<(高优先级运行态)、S<(高优先级可中断睡眠) |
| N | Low Priority | 低优先级进程(nice 值 > 0,如 nice 10 ./test.sh),最后获取 CPU |
RN(低优先级运行态)、SN(低优先级可中断睡眠) |
| L | Page Locked in Memory | 进程内存被锁定(不被 swap 交换到磁盘),常见于实时任务或内核进程 | SL(锁定内存的可中断睡眠,如 docker 相关进程) |
| s | Session Leader | 会话首领进程(创建了会话,管理多个子进程),通常是终端启动的第一个进程 | Ss(bash 终端进程,会话首领 + 可中断睡眠) |
| + | Foreground Process Group | 前台进程组(与终端交互,占用终端输入),退出终端会导致进程终止(SIGHUP) | R+(前台运行的 ls 命令)、T+(Ctrl+Z 暂停的前台进程) |
| & | Background Process Group | 后台进程组(不占用终端输入),退出终端可能继续运行(取决于 nohup 配置) |
S&(./test.sh & 启动的后台进程) |
| I | Idle | 空闲线程(内核线程专用,如 kworker 内核工作线程) |
SI(空闲的内核线程,不消耗 CPU) |
| W | Paging | 进程正在换页(内存数据与磁盘 swap 交换),仅旧内核(2.6 之前)可见 | 现代 Linux 已很少见,若出现可能是内存不足(swap 频繁使用) |
特殊进程
| 状态标识 | 英文全称 | 核心含义 | 触发场景 / 说明 |
|---|---|---|---|
| K | Wakekill | 进程正在被内核终止(因内存不足,OOM killer 选中待终止) | 系统内存耗尽时(dmesggrep OOM 可查看),进程即将被内核强制杀死 |
| W | Waking | 进程从睡眠态唤醒中(过渡状态,瞬时出现) | 几乎无法通过 ps 捕获,仅内核调度时短暂存在 |
| P | Parked | 进程被 “停放”(内核节能机制,或容器资源限制导致进程暂停) | 容器 CPU 配额耗尽、系统开启节能模式时,进程暂时不参与调度 |
| t | Traced | 进程被调试工具跟踪(如 strace、gdb 附加),处于调试暂停状态 |
strace -p PID 跟踪进程时,STAT 会显示 t(如 Tt) |
1 常见组合状态示例(快速解读)
STAT 字段的组合标识是「核心状态 + 扩展属性」,结合上面的表可快速拆解:
Ss:会话首领(s)+ 可中断睡眠(S)→ 终端的bash进程(默认后台空闲状态)R+:运行态(R)+ 前台进程组(+)→ 终端中正在执行的top命令(占用终端)Z+:僵尸态(Z)+ 前台进程组(+)→ 前台启动的子进程退出后,父进程未处理的僵尸进程D<:不可中断睡眠(D)+ 高优先级(<)→ 高优先级的磁盘 I/O 进程(如dd写入磁盘)SN:可中断睡眠(S)+ 低优先级(N)→ 低优先级的后台服务进程(如定时任务crond的子进程)S<进程是「高优先级的空闲后台进程」—— 平时不干活(睡眠等事件),但一旦有任务要处理(比如收到网络请求、I/O 完成),会比普通优先级(nice=0)的进程更快拿到 CPU 资源
2 关键补充说明(避坑重点)
- 状态与资源占用的关系:
- 高 CPU 占用:通常是
R态进程(若S态进程 % CPU 高,可能是 I/O 密集型任务的瞬时状态); - 高内存占用:与状态无关(
R、S、D态都可能),需结合%MEM字段判断; - 僵尸进程(Z):不占用 CPU / 内存(仅残留 PID 和进程描述符),但会消耗内核资源,需清理。
- 高 CPU 占用:通常是
- 不可中断睡眠(D)的处理:
- 不要强行
kill -9(无效,内核不响应信号),需等待硬件操作完成(如磁盘 I/O 结束); - 若长时间处于
D态(如 10 分钟以上),可能是硬件故障(如磁盘损坏)或驱动问题,需排查硬件 / 驱动。
- 不要强行
- 停止态(T)的恢复:
- 用
fg %n(将第 n 个后台停止进程调回前台)或bg %n(后台恢复运行); - 用
kill -18 PID信号唤醒(18是 SIGCONT 信号,与fg/bg效果一致)。
- 用
状态表总结
日常使用中,重点关注「R、S、D、Z、T」5 个核心状态,结合组合标识(如 Ss、R+)即可快速判断进程情况:
- 正常服务:多为
S态(空闲)或R态(工作中); - 异常情况:
Z态(僵尸进程需清理)、D态(I/O 阻塞需等)、T态(误暂停需恢复)。
若需通过命令筛选特定状态的进程,可结合 ps + grep,例如:
- 查找僵尸进程:
ps aux | grep Z - 查找运行态进程:
ps aux | grep R - 查找不可中断睡眠进程:
ps aux | grep D
注意事项
ps是“快照”命令:仅捕获执行瞬间的进程状态,若需实时监控(如动态看 CPU/内存变化),用top或htop(需额外安装)。- 区分进程状态:
STAT列的R(运行)、S(睡眠)、Z(僵尸)、T(停止)是核心,结合之前的“进程状态”知识理解。 - 权限限制:普通用户只能查看自己的进程和系统公开进程,
root用户可查看所有进程(用sudo ps aux获取完整权限)。
总结
ps 的核心价值是 快速筛选、定位进程,最常用的组合是:
- 查所有进程(含详情):
ps aux - 查进程父子关系:
ps -ef - 筛选特定进程:
ps aux | grep 进程名/PID - 找资源占用大户:
ps aux --sort=-%cpu/-%mem | head
掌握这几组用法,就能应对 Linux 日常进程查看的绝大多数场景!
2)kill 终止进程
kill 是 Linux 中用于向进程发送信号以实现进程管理的核心命令,其核心作用并非仅“杀死进程”,还能完成暂停进程、重启进程等操作。进程接收信号后会执行预设行为,下面从基础用法、常用信号、高级场景等方面详细介绍:
一、kill 命令基础语法
基本格式有两种,核心是通过 PID 定位进程并发送信号:
# 格式1:指定信号(信号可填数字或名称),默认信号为15
kill -[信号] [进程PID]
# 格式2:省略信号,默认发送终止信号15(SIGTERM)
kill [进程PID]
补充说明:
- PID 是进程唯一标识,可通过
ps aux或ps -ef查看; - 普通用户仅能管理自己的进程,管理
root或其他用户的进程需加sudo提升权限。

二、kill 常用信号(核心必记)
Linux 系统定义了多种信号,kill -l 命令可查看所有信号列表(共 64 种),日常常用的仅少数几种,以下是高频信号及用法:
| 信号数字 | 信号名称 | 作用与使用场景 |
|---|---|---|
| 1 | SIGHUP | 挂起信号,常用于重启服务。多数守护进程(如 nginx、sshd)收到该信号后会重新加载配置文件,无需终止进程 |
| -9 | SIGKILL | 强制终止信号,优先级最高,进程无法忽略或捕获,会被直接强制退出。适用于普通信号无法终止的卡死进程,需谨慎使用(可能导致数据丢失) |
| 15 | SIGTERM | 友好终止信号,kill 命令默认信号。进程收到后会触发清理操作(如保存数据、关闭连接),再正常退出 |
| 18 | SIGCONT | 恢复进程信号,用于唤醒被暂停的进程(对应信号19的暂停状态) |
| 19 | SIGSTOP | 暂停信号,进程收到后会立即暂停运行,无法忽略,常用于临时暂停进程排查问题 |
三、高频使用场景示例
1 友好终止进程(默认信号15)
适用于正常运行的进程,允许其清理资源。比如终止 PID 为 1234 的 nginx 工作进程:
kill 1234
# 等价于
kill -15 1234
2 强制终止顽固进程(信号9)
当进程卡死、无响应,用信号15无法终止时,用信号9强制杀死。例如强制终止 PID 为 5678 的卡死进程:
kill -9 5678
# 或用信号名
kill -SIGKILL 5678
3 重启服务(重载配置,信号1)
无需终止服务进程,仅重新加载配置。例如让 sshd 服务重载配置(先通过 ps -ef | grep sshd 找到 sshd 主进程 PID):
kill -1 8080 # 8080 为 sshd 主进程 PID
4 暂停与恢复进程(信号19和18)
临时暂停进程排查问题,后续可恢复运行。比如暂停 PID 为 9010 的进程,之后再唤醒:
# 暂停进程
kill -19 9010
# 恢复进程
kill -18 9010
5 终止多个进程
同时终止多个 PID 对应的进程,用空格分隔 PID 即可:
kill -9 1234 5678 9010
四、补充技巧与注意事项
- 结合其他命令定位 PID
若不知道进程 PID,可先用ps或pgrep查找,再通过管道组合操作。例如终止所有firefox进程:# 先查 firefox 的 PID,再强制终止 kill -9 $(pgrep firefox) - 避免滥用信号9
信号9会强制终止进程,进程无时间保存数据或关闭连接,可能导致文件损坏、数据丢失。优先尝试信号15,无效后再用信号9。 - 权限问题
普通用户无法终止root启动的进程,执行时会提示operation not permitted,此时需添加sudo:sudo kill -9 1234 - 僵尸进程的特殊处理
僵尸进程(状态Z)已退出,仅残留进程描述符,kill命令无法直接清理。需通过终止其父进程,让systemd接管并清理僵尸进程。
3)pstree 树形结构展示进程父子关系
pstree(Process Tree)是 Linux 中以树形结构展示进程父子关系的命令,能直观呈现进程的层级结构(谁是父进程、谁是子进程),比 ps -ef 更清晰地看出进程间的衍生关系,常用于排查进程起源、服务依赖等场景。以下是 pstree 的详细用法、参数解析和实际场景示例:
一、pstree 基础语法
基本格式:
pstree [选项] [PID/用户名]
默认行为:若不指定 PID 或用户名,会显示系统所有进程的树形结构(以 systemd 或 init 为根节点,PID=1)。
二、核心参数
pstree 的参数不多,但实用性极强,重点关注以下几个:
| 参数 | 功能说明 |
|---|---|
| -p | 显示每个进程的 PID(进程ID)(最常用参数,结合 PID 定位进程) |
| -u | 显示每个进程的 所有者用户名(区分不同用户的进程,如 root、普通用户) |
-a |
显示进程的 完整启动命令(含参数)(默认仅显示进程名,-a 显示完整命令) |
-h |
高亮显示 当前终端关联的进程(比如你正在操作的 bash 及子进程) |
-n |
按 PID 降序排序 显示(默认按进程启动顺序排序) |
| -c | 不合并相同名称的子进程(默认会合并重复进程,用 --- 表示数量,-c 展开显示) |
PID |
仅显示以该 PID 为根节点的进程树(聚焦单个进程的子进程,排查衍生进程) |
用户名 |
仅显示该用户所有进程的树形结构(过滤其他用户进程,简化输出) |
三、高频使用场景示例(结合实际需求)
1. 最常用组合:pstree -p(显示 PID 的完整进程树)
功能:树形结构 + 每个进程的 PID,既能看层级关系,又能快速获取 PID(用于 kill 等操作)。
pstree -pu
输出示例(简化):
systemd(1)─┬─NetworkManager(867)─┬─dhclient(987)
├─sshd(1234)─┬─sshd(5678)───bash(5679)───pstree(7890) # 当前执行 pstree 的进程链
├─nginx(2345)─┬─nginx(2346)
│ └─nginx(2347)
└─crond(3456)
解读:
systemd(1)是根进程(PID=1),所有进程都是它的子/孙进程;sshd(1234)是sshd服务主进程,衍生出远程登录的sshd(5678)子进程,再衍生bash(5679),最后是当前执行的pstree(7890);nginx(2345)是主进程,衍生两个工作进程(2346、2347)。
2. 聚焦单个进程:pstree -p PID(查看进程的子进程)
场景:已知某进程 PID,想知道它衍生了哪些子进程(比如排查 nginx 有多少工作进程)。
# 先通过 ps 找到 nginx 主进程 PID(假设是 2345)
ps aux | grep nginx
# 查看该进程的子进程树
pstree -p 2345
输出示例:
nginx(2345)─┬─nginx(2346)
└─nginx(2347)
用途:快速确认服务的进程架构(主进程+子进程数量)。
3. 显示用户和命令:pstree -u -a(完整信息)
功能:树形结构 + PID + 用户名 + 完整启动命令,适合详细排查进程的启动参数。
pstree -u -a sshd # 聚焦 sshd 相关进程,显示用户和完整命令
输出示例:
sshd(1234,root) -D # root 启动的 sshd 主进程,命令是 sshd -D
└─sshd(5678,user1) # 用户 user1 登录的 sshd 子进程
└─bash(5679,user1)
└─pstree(7890,user1) -u -a sshd # 当前执行的命令
解读:
(1234,root)表示 PID=1234,所有者是 root;-D是sshd主进程的启动参数(后台运行)。
4. 过滤用户进程:pstree -u 用户名(仅看某个用户的进程)
场景:查看普通用户 user1 所有进程的层级关系,避免系统进程干扰。
pstree -u user1
输出示例:
bash(5679,user1)─┬─pstree(7890,user1)
└─vim(8901,user1) # user1 正在编辑的文件
5. 高亮当前终端进程:pstree -h(快速定位自己的进程)
场景:终端中启动了多个进程,想快速找到当前终端关联的进程链。
pstree -h -p
输出中,当前终端的 bash 及子进程(如 vim、pstree)会被高亮显示,一目了然。
四、进阶用法:组合过滤与问题排查
1. 查找僵尸进程的父进程(关键场景)
僵尸进程(Z 态)需通过父进程清理,pstree 可快速定位僵尸进程的父进程:
# 步骤1:找到僵尸进程的 PID(假设是 6666)
ps aux | grep Z # 输出中找到 <defunct> 标识的僵尸进程,PID=6666
# 步骤2:查看该僵尸进程的父进程
pstree -p 6666 # 输出会显示父进程 PID,比如 parent(5555)───defunct(6666)
# 步骤3:终止父进程(或重启父进程),清理僵尸进程
kill -9 5555
2. 合并/展开重复进程:-c 参数
默认 pstree 会合并相同名称的子进程(用 ---N--- 表示数量),-c 会展开显示:
pstree -p nginx # 默认合并(若有 3 个工作进程)
# 输出:nginx(2345)───nginx(2346)---2---nginx(2348)
pstree -p -c nginx # 展开显示
# 输出:nginx(2345)─┬─nginx(2346)
# ├─nginx(2347)
# └─nginx(2348)
五、注意事项
- 权限限制:普通用户只能查看自己有权限的进程,
root用户可查看所有进程(用sudo pstree获取完整权限); - 输出简化:系统进程较多时,
pstree输出会很长,可结合管道grep过滤关键字,比如pstree -p | grep nginx; - 与
ps的区别:ps侧重进程的快照信息(CPU、内存、PID),pstree侧重进程的层级关系,二者互补。
总结
pstree 的核心价值是 直观展示进程父子关系,高频用法组合:
- 快速看整体进程树(含 PID):
pstree -p - 聚焦单个进程的子进程:
pstree -p PID - 详细排查(用户+完整命令):
pstree -u -a 进程名 - 排查僵尸进程父进程:
pstree -p 僵尸进程PID
掌握这些用法,能快速定位进程起源、衍生关系,尤其适合排查服务进程架构、僵尸进程等问题!
4)top 实时进程
top 是 Linux 中实时动态监控进程状态的核心命令,能实时显示系统 CPU、内存、进程负载等关键信息,默认每 3 秒刷新一次,是排查系统卡顿、资源占用过高(CPU/内存)的必备工具。以下从界面解读、核心操作、参数配置等方面,详细讲解 top 的使用方法:
一、top 界面核心解读(启动即见)
top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
| 命令参数 | 功能 | 示例 |
|---|---|---|
-d 秒数 |
设置刷新间隔 | top -d 1(每秒刷新一次) |
-i |
不显示闲置进程 | |
-p PID |
仅监控指定 PID 的进程 | top -p 1234 5678(同时监控 PID 1234 和 5678) |
-u 用户名 |
仅监控指定用户的进程 | top -u root(仅显示 root 用户的进程) |
-H |
显示进程的线程信息(线程级监控) | top -H -p 1234(查看 PID 1234 进程的所有线程) |
-b |
批处理模式(非交互式,输出文本) | top -b -n 1 > top.log(输出 1 次快照到文件,用于日志分析) |
-n 次数 |
刷新指定次数后退出 | top -n 3(刷新 3 次后自动退出) |
直接输入 top 启动,界面分为 系统概览区(上半部分) 和 进程列表区(下半部分),各字段含义如下:
1. 系统概览区(关键指标,快速判断系统状态)

top - 15:30:45 up 2 days, 3:45, 2 users, load average: 0.80, 0.65, 0.50
Tasks: 230 total, 1 running, 228 sleeping, 1 stopped, 0 zombie
%Cpu(s): 12.5 us, 3.2 sy, 0.0 ni, 83.3 id, 0.0 wa, 0.0 hi, 1.0 si, 0.0 st
MiB Mem : 15938.4 total, 1200.5 free, 8900.2 used, 5837.7 buff/cache
MiB Swap: 16384.0 total, 15000.0 free, 1384.0 used. 6200.3 avail Mem
逐行解读:
| 行信息 | 字段含义 | 关键说明 |
|---|---|---|
| 第 1 行(系统运行状态) | 15:30:45:当前时间up 2 days, 3:45:系统运行时长2 users:当前登录用户数load average: 0.80, 0.65, 0.50:系统负载(1/5/15 分钟平均) |
负载值参考:单核 CPU 负载 >1 表示繁忙,多核 CPU 负载 > 核心数 表示繁忙(如 4 核 CPU 负载 >4 需关注) |
| 第 2 行(进程统计) | 230 total:总进程数1 running:运行态(R)进程数228 sleeping:睡眠态(S/D)进程数1 stopped:停止态(T)进程数0 zombie:僵尸态(Z)进程数 |
若 zombie >0 需排查僵尸进程;running 长期 > 核心数 可能 CPU 不足 |
| 第 3 行(CPU 使用率) | us:用户进程 CPU 占比(如应用程序)sy:内核进程 CPU 占比(如系统调用)ni:高优先级进程(nice<0)CPU 占比id:空闲 CPU 占比wa:I/O 等待 CPU 占比(如磁盘读写)hi:硬件中断 CPU 占比si:软件中断 CPU 占比st:虚拟机占用 CPU 占比(云服务器场景) |
关键指标:us 高 → 应用耗 CPU;sy 高 → 系统内核繁忙;wa 高 → 磁盘 I/O 瓶颈 |
| 第 4-5 行(内存/交换分区) | total:总容量free:完全空闲容量used:已使用容量buff/cache:缓存/缓冲区容量avail Mem:可用内存(含 free + 可回收 buff/cache) |
内存判断:avail Mem 充足 → 内存无压力;Swap used 持续增长 → 物理内存不足,依赖 swap 导致卡顿 |
2. 进程列表区(实时排序的进程详情)
默认按 CPU 使用率降序排序,核心字段如下(按界面显示顺序):
| 字段 | 含义 | 关键说明 |
|---|---|---|
| PID | 进程唯一 ID | 用于 kill 终止进程的核心依据 |
| USER | 进程所有者 | 区分 root/普通用户进程(如 root 进程多为系统服务) |
| PR | 进程优先级(内核动态调整) | 数值越小优先级越高,不可手动修改 |
| NI | 进程 nice 值(手动设置的优先级) | 范围 -20~19,值越小优先级越高(renice 命令调整) |
| VIRT | 进程虚拟内存大小(KB) | 包含物理内存、swap、共享库,参考意义不大 |
| RES | 进程物理内存大小(KB,常驻内存) | 进程实际占用的物理内存,核心内存指标 |
| SHR | 进程共享内存大小(KB) | 与其他进程共享的内存(如共享库),不可单独算作该进程占用 |
| S | 进程状态 | 同 ps 的 STAT 字段(R=运行、S=睡眠、Z=僵尸等) |
| %CPU | 进程占用 CPU 百分比 | 实时更新,默认排序依据 |
| %MEM | 进程占用内存百分比 | 实时更新,可切换为排序依据 |
| TIME+ | 进程累计占用 CPU 时间 | 非运行时长,是实际使用 CPU 的总时长 |
| COMMAND | 进程启动命令(含参数) | 识别进程对应的应用(如 nginx、java) |
二、top 核心操作
top 启动后,通过快捷键实现排序、筛选、刷新等操作(无需退出,直接按键盘):
1. 排序操作(按不同字段排序)
| 快捷键 | 功能 | 示例 |
|---|---|---|
P(大写) |
按 %CPU 降序排序(默认) | 快速找到 CPU 占用最高的进程 |
M(大写) |
按 %MEM 降序排序 | 快速找到内存占用最高的进程 |
N(大写) |
按 PID 降序排序 | 查找特定 PID 附近的进程 |
T(大写) |
按 TIME+(累计 CPU 时间)降序排序 | 找到长期占用 CPU 的进程 |
R(大写) |
反向排序(升序/降序切换) | 按 CPU 升序,查看空闲进程 |
2. 筛选与搜索操作
| 快捷键 | 功能 | 操作示例 |
|---|---|---|
k(小写) |
终止进程(发送信号) | 按 k → 输入 PID → 输入信号(默认 15,强制终止输 9)→ 回车 |
u(小写) |
筛选指定用户的进程 | 按 u → 输入用户名(如 root、user1)→ 回车,仅显示该用户进程 |
p(小写) |
筛选指定 PID 的进程 | 按 p → 输入 PID(如 1234)→ 回车,仅显示该进程 |
/(斜杠)没有就是版本老了 |
搜索进程名 | 按 / → 输入进程名(如 nginx)→ 回车,高亮显示匹配进程(按 n 切换下一个) |
| L(大写)没有/用这个 | 搜索进程名 |
3. 界面控制操作
| 快捷键 | 功能 | 说明 |
|---|---|---|
q(小写) |
退出 top |
核心退出方式 |
s(小写) |
修改刷新间隔 | 按 s → 输入秒数(如 1,表示每秒刷新)→ 回车 |
l(小写) |
隐藏/显示第 1 行(系统运行状态) | 简化界面,仅保留进程列表 |
t(小写) |
隐藏/显示第 2-3 行(进程/CPU 统计) | 进一步简化界面 |
m(小写) |
隐藏/显示内存统计行(第 4-5 行) | 不需要内存信息时隐藏 |
1(数字 1) |
显示所有 CPU 核心的单独使用率 | 多核 CPU 场景下,查看每个核心的负载(如 4 核会显示 4 行 %Cpu0~%Cpu3) |
4. 其他实用操作
| 快捷键 | 功能 | 场景 |
|---|---|---|
z(小写) |
高亮显示进程列表 | 区分不同状态的进程,更易读 |
x(小写) |
高亮当前排序字段 | 明确当前按哪个字段排序(如 %CPU 字段高亮) |
c(小写) |
显示/隐藏完整命令行 | 默认显示进程名,按 c 显示完整启动命令(含参数,如 java -jar app.jar) |
三、常见使用场景示例
1. 排查 CPU 占用过高
# 启动 top,默认按 CPU 降序排序
top
# 操作:
# 1. 查看 %CPU 最高的进程(第一行),记录 PID 和 COMMAND(如 PID=5678,COMMAND=java)
# 2. 若需终止,按 k → 输入 5678 → 输入 9(强制终止)→ 回车
# 3. 若需查看多核 CPU 负载,按 1 显示每个核心的使用率
2. 排查内存占用过高
# 启动 top 后按 M 排序,或直接启动时指定
top -o %MEM # -o 指定排序字段(%MEM 或 %CPU)
# 查看 RES 和 %MEM 最高的进程,判断是否为异常占用(如应用内存泄漏)
3. 监控特定服务(如 nginx)
# 方法 1:启动后搜索
top → 按 / 或者 L → 输入 nginx → 回车(高亮显示 nginx 进程)
# 方法 2:启动时筛选(先查 nginx 的 PID)
pgrep nginx # 输出 nginx 的所有 PID(如 2345 2346)
top -p 2345,2346 # 仅监控这些 PID
4. 导出监控日志(用于后续分析)
# 批处理模式输出 10 次快照到文件,每次间隔 2 秒
top -b -d 2 -n 10 > top_monitor.log
# 后续可通过 cat 或 grep 分析日志
grep "nginx" top_monitor.log # 查看 nginx 进程的监控数据
5.监控某个用户
top -> u -> 输入'tangge'

四、注意事项与进阶工具
top与ps的区别:top是实时动态监控,ps是某一时刻的快照,排查实时负载用top,定位进程静态信息用ps;- 权限问题:普通用户只能查看自己的进程,
root用户可查看所有进程(用sudo top获取完整权限); - 进阶替代工具:
top功能基础,若需更美观的界面或更多功能,可安装htop(yum install htop或apt install htop),支持鼠标操作、更清晰的颜色区分,用法与top兼容。
总结
top 的核心价值是 实时监控系统资源和进程状态,日常使用高频场景:
- 排查 CPU/内存占用过高:启动后按
P或M排序,定位异常进程; - 终止顽固进程:按
k输入 PID 和信号 9; - 监控特定服务/用户:用
u、p或启动参数筛选。
掌握界面解读和核心快捷键(P/M/k/u/q),就能应对绝大多数系统资源监控和进程排查场景!
5) netstat 网络端口
netstat(Network Statistics)是 Linux 中用于查看网络连接状态、端口监听、路由表、网络接口统计等的经典工具,虽在部分新系统中被 ss 命令替代(功能更高效),但因其兼容性强、用法直观,仍是日常网络排查(如端口占用、连接泄露)的常用工具。以下从核心用法、参数解析、高频场景等方面详细介绍:
一、先确认 netstat 是否安装
部分精简系统(如 CentOS 8+、Ubuntu 20.04+)默认未预装 netstat,需先安装:
# CentOS/RHEL
sudo yum install -y net-tools # netstat 属于 net-tools 工具集
# Ubuntu/Debian
sudo apt install -y net-tools
# Alpine Linux
sudo apk add net-tools
安装后输入 netstat --help 验证是否可用。
二、netstat 核心语法与参数
基本格式:
netstat [选项]
核心参数(按功能分类,必记高频组合):
| 参数组 | 功能说明 | 常用组合 |
|---|---|---|
-t |
显示 TCP 连接/端口 | 搭配 -l(监听)、-n(数字格式)、-p(进程) |
-u |
显示 UDP 连接/端口 | 同上,用于 UDP 服务(如 DNS、NTP) |
| -l | 仅显示「监听状态」的端口(服务正在监听的端口) | 核心参数,排查端口是否启动成功 |
| -n | 以「数字格式」显示(IP 而非域名、端口号而非服务名) | 避免反向解析,速度更快,输出更简洁 |
| -p | 显示占用端口/连接的「进程 PID 和进程名」 | 关键!定位哪个进程占用了端口(需 root 权限) |
| -a | 显示「所有状态」的连接(监听、已建立、关闭等待等) | 查看完整连接列表,排查连接泄露 |
-r |
显示系统「路由表」(类似 route 命令) |
排查网络路由问题 |
-i |
显示「网络接口」统计(收发数据包、丢包等) | 排查网卡流量或故障 |
-s |
显示「协议统计」(TCP/UDP/ICMP 等的收发计数) | 分析网络协议层面的问题 |
基本用法
netstat -anp | grep 进程号 # 查看该进程网络信息
netstat -lnp | grep 端口号 # 查看网络端口占用情况
三、高频使用场景(必掌握)
1. 查看所有监听端口(含 TCP/UDP,最常用)
场景:验证服务是否启动成功(如 nginx 的 80 端口、sshd 的 22 端口),或排查端口是否被占用。
sudo netstat -tuln # 核心组合:t(TCP)+u(UDP)+l(监听)+n(数字格式)
输出示例(简化):
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
udp 0 0 127.0.0.1:323 0.0.0.0:*
udp 0 0 0.0.0.0:68 0.0.0.0:*
解读:
Proto:协议(tcp/udp);Local Address:本地监听地址+端口(0.0.0.0:80表示所有网卡的 80 端口,127.0.0.1:323仅本地回环);State:状态(LISTEN表示监听中,UDP 无状态,所以为空)。
2. 定位端口占用进程(如 80 端口被谁占用)
场景:启动服务时提示「端口已被占用」,需找到占用进程并终止。
sudo netstat -tulnp | grep 80 # 加 p 显示进程,grep 筛选端口
输出示例:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2345/nginx: master p
解读:
- 最后一列
2345/nginx表示:PID=2345 的nginx进程占用了 80 端口; - 若需终止该进程:
sudo kill -9 2345。
3. 查看已建立的 TCP 连接
场景:排查服务的连接数(如 nginx 有多少活跃客户端连接)、连接泄露(如大量 TIME_WAIT 连接)。
sudo netstat -tan # t(TCP)+a(所有状态)+n(数字格式)
输出示例(简化):
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.1.100:80 10.0.0.5:54321 ESTABLISHED # 已建立连接
tcp 0 1 192.168.1.100:22 10.0.0.6:65432 SYN_SENT # 正在发起连接
tcp 0 0 192.168.1.100:80 10.0.0.7:43210 TIME_WAIT # 连接关闭等待
关键状态解读:
ESTABLISHED:已建立的活跃连接;TIME_WAIT:连接已关闭,处于超时等待(正常现象,过多可能导致端口耗尽);CLOSE_WAIT:对方关闭连接,本地未关闭(可能是程序bug,需排查应用)。
4. 查看进程的网络连接(如 nginx 打开了哪些连接)
场景:已知进程 PID 或名称,查看其所有网络连接(TCP/UDP)。
# 方法 1:按进程名筛选(如 nginx)
sudo netstat -tulnp | grep nginx
# 方法 2:按 PID 筛选(如 PID=2345)
sudo netstat -tulnp | grep 2345
输出示例:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2345/nginx: master p
tcp 0 0 192.168.1.100:80 10.0.0.5:54321 ESTABLISHED 2346/nginx: worker p
5. 查看路由表(排查网络不通)
场景:服务器无法访问某地址,排查路由是否正确。
netstat -r # 或 netstat -rn(n 数字格式,不解析主机名)
输出示例:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 # 默认网关
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 # 本地网段
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 # docker 网段
解读:
Destination:目标网段;Gateway:网关(0.0.0.0表示直连,192.168.1.1是默认网关);Iface:出口网卡(如eth0、docker0)。
6. 查看网络接口统计(排查网卡故障)
场景:服务器网络卡顿,查看网卡是否有丢包、错包。
netstat -i # 或 netstat -ie(e 显示网卡详细信息,如 MAC 地址)
输出示例:
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 123456 0 0 0 78901 0 0 0 BMRU
lo 65536 4321 0 0 0 4321 0 0 0 LRU
docker0 1500 567 0 0 0 890 0 0 0 BMU
关键字段:
RX-OK/TX-OK:接收/发送成功的数据包数;RX-ERR/TX-ERR:接收/发送错误的数据包数(非 0 表示网卡故障);RX-DRP/TX-DRP:接收/发送丢弃的数据包数(过多可能是带宽或硬件瓶颈)。
四、netstat 与 ss 的对比(为什么新系统推荐 ss)
ss 是 iproute2 工具集的命令,专门替代 netstat,优势是速度更快、支持更多过滤选项、输出更简洁,用法和 netstat 类似:
| 功能需求 | netstat 命令 | ss 命令(推荐) |
|---|---|---|
| 查看监听端口 | netstat -tuln |
ss -tuln |
| 定位端口占用 | `netstat -tulnp | grep 80` |
| 查看已建立连接 | netstat -tan |
ss -tan |
| 按进程筛选 | `netstat -tulnp | grep nginx` |
ss 额外实用功能(netstat 无):
# 查看 TCP 连接的状态统计(快速排查连接泄露)
ss -s
# 按连接状态筛选(如仅看 TIME_WAIT 连接)
ss -tan state TIME-WAIT
五、注意事项
- 权限问题:
-p参数(显示进程)需要root权限,普通用户执行会显示PID/Program name为--; - 速度问题:
netstat会遍历所有连接和进程,在连接数多的服务器上速度较慢,建议用ss替代; - 状态解读:
TIME_WAIT连接过多(如超过 1 万)可能导致端口耗尽,可通过调整内核参数优化(如net.ipv4.tcp_tw_reuse=1); - 区分监听端口:
0.0.0.0:80表示监听所有网卡的 80 端口(对外提供服务),127.0.0.1:80仅监听本地回环(仅本机可访问)。
总结
netstat 的核心价值是 直观排查网络连接和端口问题,高频用法集中在:
- 查看监听端口:
sudo netstat -tuln; - 定位端口占用:
sudo netstat -tulnp | grep 端口号; - 排查连接状态:
sudo netstat -tan; - 查看路由/网卡统计:
netstat -r/netstat -i。
虽 ss 更高效,但 netstat 兼容性强、用法简单,仍是新手入门和老系统排查的首选工具。掌握以上场景,就能应对绝大多数网络相关的排查需求!

浙公网安备 33010602011771号