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 命令的核心语法

image

基本格式:

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  # 过滤

输出字段说明(重点关注红框部分):

image

字段 含义
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):

image

字段 含义
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

输出字段说明(新增优先级相关字段):

image

字段 含义
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 过滤指定进程(如 nginxmysql):

# 方法 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

image

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 会话首领进程(创建了会话,管理多个子进程),通常是终端启动的第一个进程 Ssbash 终端进程,会话首领 + 可中断睡眠)
+ 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 进程被调试工具跟踪(如 stracegdb 附加),处于调试暂停状态 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 关键补充说明(避坑重点)

  1. 状态与资源占用的关系
    • 高 CPU 占用:通常是 R 态进程(若 S 态进程 % CPU 高,可能是 I/O 密集型任务的瞬时状态);
    • 高内存占用:与状态无关(RSD 态都可能),需结合 %MEM 字段判断;
    • 僵尸进程(Z):不占用 CPU / 内存(仅残留 PID 和进程描述符),但会消耗内核资源,需清理。
  2. 不可中断睡眠(D)的处理
    • 不要强行 kill -9(无效,内核不响应信号),需等待硬件操作完成(如磁盘 I/O 结束);
    • 若长时间处于 D 态(如 10 分钟以上),可能是硬件故障(如磁盘损坏)或驱动问题,需排查硬件 / 驱动。
  3. 停止态(T)的恢复
    • fg %n(将第 n 个后台停止进程调回前台)或 bg %n(后台恢复运行);
    • kill -18 PID 信号唤醒(18 是 SIGCONT 信号,与 fg/bg 效果一致)。

状态表总结

日常使用中,重点关注「R、S、D、Z、T」5 个核心状态,结合组合标识(如 SsR+)即可快速判断进程情况:

  • 正常服务:多为 S 态(空闲)或 R 态(工作中);
  • 异常情况:Z 态(僵尸进程需清理)、D 态(I/O 阻塞需等)、T 态(误暂停需恢复)。

若需通过命令筛选特定状态的进程,可结合 ps + grep,例如:

  • 查找僵尸进程:ps aux | grep Z
  • 查找运行态进程:ps aux | grep R
  • 查找不可中断睡眠进程:ps aux | grep D

注意事项

  1. ps 是“快照”命令:仅捕获执行瞬间的进程状态,若需实时监控(如动态看 CPU/内存变化),用 tophtop(需额外安装)。
  2. 区分进程状态:STAT 列的 R(运行)、S(睡眠)、Z(僵尸)、T(停止)是核心,结合之前的“进程状态”知识理解。
  3. 权限限制:普通用户只能查看自己的进程和系统公开进程,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 auxps -ef 查看;
  • 普通用户仅能管理自己的进程,管理 root 或其他用户的进程需加 sudo 提升权限。

image

二、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

四、补充技巧与注意事项

  1. 结合其他命令定位 PID
    若不知道进程 PID,可先用 pspgrep 查找,再通过管道组合操作。例如终止所有 firefox 进程:
    # 先查 firefox 的 PID,再强制终止
    kill -9 $(pgrep firefox)
    
  2. 避免滥用信号9
    信号9会强制终止进程,进程无时间保存数据或关闭连接,可能导致文件损坏、数据丢失。优先尝试信号15,无效后再用信号9。
  3. 权限问题
    普通用户无法终止 root 启动的进程,执行时会提示 operation not permitted,此时需添加 sudo
    sudo kill -9 1234
    
  4. 僵尸进程的特殊处理
    僵尸进程(状态Z)已退出,仅残留进程描述符,kill 命令无法直接清理。需通过终止其父进程,让 systemd 接管并清理僵尸进程。

3)pstree 树形结构展示进程父子关系

pstree(Process Tree)是 Linux 中以树形结构展示进程父子关系的命令,能直观呈现进程的层级结构(谁是父进程、谁是子进程),比 ps -ef 更清晰地看出进程间的衍生关系,常用于排查进程起源、服务依赖等场景。以下是 pstree 的详细用法、参数解析和实际场景示例:

一、pstree 基础语法

基本格式:

pstree [选项] [PID/用户名]

默认行为:若不指定 PID 或用户名,会显示系统所有进程的树形结构(以 systemdinit 为根节点,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;
  • -Dsshd 主进程的启动参数(后台运行)。

4. 过滤用户进程:pstree -u 用户名(仅看某个用户的进程)
场景:查看普通用户 user1 所有进程的层级关系,避免系统进程干扰。

pstree -u user1

输出示例:

bash(5679,user1)─┬─pstree(7890,user1)
                 └─vim(8901,user1)  # user1 正在编辑的文件

5. 高亮当前终端进程:pstree -h(快速定位自己的进程)
场景:终端中启动了多个进程,想快速找到当前终端关联的进程链。

pstree -h -p

输出中,当前终端的 bash 及子进程(如 vimpstree)会被高亮显示,一目了然。

四、进阶用法:组合过滤与问题排查

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)

五、注意事项

  1. 权限限制:普通用户只能查看自己有权限的进程,root 用户可查看所有进程(用 sudo pstree 获取完整权限);
  2. 输出简化:系统进程较多时,pstree 输出会很长,可结合管道 grep 过滤关键字,比如 pstree -p | grep nginx
  3. 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. 系统概览区(关键指标,快速判断系统状态)

image

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 进程启动命令(含参数) 识别进程对应的应用(如 nginxjava

二、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 → 输入用户名(如 rootuser1)→ 回车,仅显示该用户进程
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'

image

四、注意事项与进阶工具

  1. topps 的区别top 是实时动态监控,ps 是某一时刻的快照,排查实时负载用 top,定位进程静态信息用 ps
  2. 权限问题:普通用户只能查看自己的进程,root 用户可查看所有进程(用 sudo top 获取完整权限);
  3. 进阶替代工具top 功能基础,若需更美观的界面或更多功能,可安装 htopyum install htopapt install htop),支持鼠标操作、更清晰的颜色区分,用法与 top 兼容。

总结

top 的核心价值是 实时监控系统资源和进程状态,日常使用高频场景:

  • 排查 CPU/内存占用过高:启动后按 PM 排序,定位异常进程;
  • 终止顽固进程:按 k 输入 PID 和信号 9;
  • 监控特定服务/用户:用 up 或启动参数筛选。

掌握界面解读和核心快捷键(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:出口网卡(如 eth0docker0)。

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)

ssiproute2 工具集的命令,专门替代 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

五、注意事项

  1. 权限问题:-p 参数(显示进程)需要 root 权限,普通用户执行会显示 PID/Program name--
  2. 速度问题:netstat 会遍历所有连接和进程,在连接数多的服务器上速度较慢,建议用 ss 替代;
  3. 状态解读:TIME_WAIT 连接过多(如超过 1 万)可能导致端口耗尽,可通过调整内核参数优化(如 net.ipv4.tcp_tw_reuse=1);
  4. 区分监听端口: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 兼容性强、用法简单,仍是新手入门和老系统排查的首选工具。掌握以上场景,就能应对绝大多数网络相关的排查需求!

posted @ 2025-11-07 15:31  【唐】三三  阅读(4)  评论(0)    收藏  举报