目录
[二、ps aux:进程快照的瑞士军刀](#二、ps aux:进程快照的瑞士军刀)
[2.1 为什么是 ps aux 而不是 ps -ef?](#2.1 为什么是 ps aux 而不是 ps -ef?)
[2.2 字段逐一拆解](#2.2 字段逐一拆解)
[2.3 常用组合技](#2.3 常用组合技)
[3.1 启动与退出](#3.1 启动与退出)
[3.2 界面解读](#3.2 界面解读)
[3.3 核心交互快捷键](#3.3 核心交互快捷键)
[4.1 安装](#4.1 安装)
[4.2 htop的独特优势](#4.2 htop的独特优势)
[4.3 常用操作](#4.3 常用操作)
[五、进程状态:R、S、D、Z 背后的故事](#五、进程状态:R、S、D、Z 背后的故事)
[5.1 R(Running,运行状态)](#5.1 R(Running,运行状态))
[5.2 S(Sleeping,可中断睡眠)](#5.2 S(Sleeping,可中断睡眠))
[5.3 D(Disk Sleep,不可中断睡眠)](#5.3 D(Disk Sleep,不可中断睡眠))
[5.4 Z(Zombie,僵尸进程)](#5.4 Z(Zombie,僵尸进程))
[5.5 其他状态速览](#5.5 其他状态速览)
一、引言:程序是死的,进程是活的
在Windows的任务管理器里,你看到的是一个个正在运行的程序;在Linux中,这些"正在运行的程序"有一个更精确的名字------进程(Process)。
初学者常把"程序"和"进程"混为一谈,但它们有本质区别。用一个生活化的类比:
-
程序 = 菜谱。它是一堆指令的集合,静静地躺在纸上(硬盘里),你不动它,它什么也不会发生。
-
进程 = 照着菜谱做菜的过程。厨师(CPU)读取菜谱(程序),准备食材(数据),开火烹饪(执行)。同一份菜谱可以同时被多个厨师执行,做出多道菜------这对应着"一个程序可以启动多个进程"。
核心区别总结:
| 对比维度 | 程序(Program) | 进程(Process) |
|---|---|---|
| 存在形式 | 静态的二进制文件,存储在硬盘上 | 动态的执行过程,运行在内存中 |
| 生命周期 | 永久存在(除非被删除) | 临时的,有创建、运行、终止的过程 |
| 唯一标识 | 文件名 | PID(进程ID) |
| 资源占用 | 仅占用磁盘空间 | 占用CPU、内存、I/O等系统资源 |
当你执行ls命令时,系统会做以下几件事:
-
在磁盘上找到
/usr/bin/ls这个二进制程序 -
把它加载到内存中
-
分配一个唯一的PID(进程ID)
-
开始执行
-
执行完毕后,进程消亡,内存释放
理解了这个基本模型,我们接下来学习如何"看"这些正在运行的进程。
二、ps aux:进程快照的瑞士军刀
2.1 为什么是 ps aux 而不是 ps -ef?
ps(process status)是查看进程状态的基础命令。你可能会看到两种主流用法:ps aux 和 ps -ef。
这两者的区别源于Unix历史的两种风格:
-
ps aux源于 BSD Unix 风格 -
ps -ef源于 System V Unix 风格
现代Linux系统同时支持两种写法。对于日常查看进程,推荐使用 ps aux,因为它输出信息更直观,而且包含了CPU和内存使用率这些关键指标。
执行一下试试:
bash
ps aux | head -10
你会看到类似这样的输出:
text
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169740 11508 ? Ss Apr21 0:03 /sbin/init
root 2 0.0 0.0 0 0 ? S Apr21 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< Apr21 0:00 [rcu_gp]
2.2 字段逐一拆解
每个字段都有明确的含义,我们来逐一解读:
| 字段 | 全称/含义 | 解读 |
|---|---|---|
| USER | 用户名 | 启动这个进程的用户是谁 |
| PID | Process ID | 进程的唯一标识符,像身份证号 |
| %CPU | CPU使用率 | 进程当前占用的CPU百分比 |
| %MEM | 内存使用率 | 进程当前占用的物理内存百分比 |
| VSZ | Virtual Size | 虚拟内存大小(单位KB),包括代码、数据、共享库等 |
| RSS | Resident Set Size | 驻留内存大小(单位KB),即实际占用的物理内存 |
| TTY | Teletype | 进程关联的终端。?表示不依赖终端(如系统服务) |
| STAT | State | 进程状态(R/S/D/Z等,后面会详解) |
| START | 启动时间 | 进程何时被启动 |
| TIME | CPU累计时间 | 进程累计占用的CPU时间 |
| COMMAND | 命令 | 启动该进程的完整命令 |
重点理解两个内存字段:
-
VSZ(虚拟内存) :进程"认为自己拥有的内存",包含被交换出去的部分和共享库。这个值通常很大,参考意义有限。
-
RSS(驻留内存) :进程"实际占用的物理内存",这才是判断内存占用的核心指标。
一个简单记忆:排查内存问题看RSS,不要被VSZ吓到。
2.3 常用组合技
bash
# 查看某用户的所有进程
ps aux | grep ^用户名
# 查看某服务的进程(如nginx)
ps aux | grep nginx | grep -v grep
# 按内存使用率排序,找出最占内存的5个进程
ps aux --sort=-%mem | head -6
# 按CPU使用率排序,找出最耗CPU的5个进程
ps aux --sort=-%cpu | head -6
三、top:实时的系统监控仪表盘
ps aux给出的是执行那一刻的"快照",而top给出的是实时动态的监控视图,默认每3秒刷新一次。
3.1 启动与退出
bash
top
按q退出。
3.2 界面解读
top界面分为上下两部分:统计信息区 和进程列表区。
统计信息区(前5行):
-
第1行:系统运行时间、登录用户数、系统负载(load average,1分钟/5分钟/15分钟平均值)
-
第2行:进程总数、运行中、睡眠中、停止、僵尸进程数量
-
第3行:CPU使用率分布(us用户态、sy内核态、id空闲、wa等待I/O)
-
第4-5行:物理内存和交换分区的使用情况
进程列表区 的字段与ps aux基本一致,重点关注:
-
%CPU:单进程CPU占用 -
%MEM:单进程内存占用 -
RES:物理内存占用(等同于RSS) -
S:进程状态
3.3 核心交互快捷键
top不只是"看",还能在监控过程中进行操作:
| 快捷键 | 功能 |
|---|---|
P |
按CPU使用率降序排列(大写P) |
M |
按内存使用率降序排列(大写M) |
T |
按累计CPU时间排序 |
N |
按PID排序 |
k |
杀死进程(输入PID后回车确认) |
r |
重新设置进程优先级(renice) |
u |
只显示指定用户的进程 |
c |
切换显示完整命令行 |
1 |
展开/折叠多核CPU显示 |
q |
退出 |
实用技巧:
bash
# 只监控特定用户的进程
top -u www-data
# 指定刷新间隔为1秒
top -d 1
# 只显示特定PID的进程
top -p 1234
四、htop:top的全面增强版
top功能强大但界面略显简陋,htop是其现代化增强版,提供彩色界面、鼠标支持、更便捷的操作方式。
4.1 安装
bash
# Ubuntu/Debian
sudo apt install htop -y
# CentOS/RHEL
sudo dnf install htop -y # CentOS 8+
sudo yum install htop -y # CentOS 7
4.2 htop的独特优势
与top相比,htop的改进包括:
| 特性 | top | htop |
|---|---|---|
| 界面配色 | 单色 | 彩色区分CPU/内存/交换空间 |
| 操作方式 | 纯键盘快捷键 | 支持鼠标点击 |
| 进程树 | 不支持 | 按F5显示父子进程树 |
| 滚动查看 | 只能看一屏 | 支持上下滚动查看所有进程 |
| 杀进程 | 需要输入PID | 方向键选中后按F9选择信号 |
| 搜索 | 不支持 | 按/直接搜索进程名 |
4.3 常用操作
bash
htop
进入界面后:
-
方向键 / 鼠标滚轮:上下浏览进程
-
F5:切换树形视图,看清父子进程关系
-
F6:选择排序字段(CPU、内存、PID等)
-
F9:杀死选中进程,会弹出信号选择菜单
-
/:搜索进程名
-
F10 / q:退出
注意:htop的F9杀进程功能非常方便,但也更容易误操作。杀死系统关键进程可能导致系统不稳定,操作前务必确认。
五、进程状态:R、S、D、Z 背后的故事
在ps aux的STAT 列或top的S列,你会看到R、S、D、Z等字母。理解这些状态,是排查系统问题的关键。
5.1 R(Running,运行状态)
含义:进程正在CPU上运行,或者在运行队列中等待CPU。
这是最"活跃"的状态。需要注意的是,R状态不意味着进程一定在"此刻"运行------它可能在排队等CPU。在多核系统上,处于R状态的进程数可能多于CPU核心数,这说明有进程在等待调度。
5.2 S(Sleeping,可中断睡眠)
含义:进程在等待某个事件(如用户输入、网络数据、定时器),事件发生时会被唤醒。
这是最常见的进程状态 。你系统中的绝大多数进程都处于S状态------毕竟CPU就那么几个,大部分时间大家都在"睡觉等待任务"。当你cat一个文件时,进程在读取磁盘期间就会进入S状态。
5.3 D(Disk Sleep,不可中断睡眠)
含义 :进程正在等待I/O操作(通常是磁盘读写),且不能被信号中断。
这是需要特别注意的状态。D状态的进程无法被kill -9杀死,因为内核需要保护设备交互过程不被破坏。
什么情况会出现大量D状态进程?
-
磁盘出现坏道或I/O性能极差
-
NFS网络文件系统无响应
-
存储设备故障
如果你发现系统负载高但CPU使用率不高,同时有很多D状态进程------瓶颈在磁盘I/O,而非CPU。
5.4 Z(Zombie,僵尸进程)
含义:进程已经结束,但父进程还没有"收尸"(调用wait读取退出状态)。
僵尸进程不占用任何系统资源(内存、CPU都已释放),只占用一个PID槽位。少量僵尸进程无需担心,系统重启会自动清理。
但如果大量积累,说明父进程有bug,没有正确处理子进程退出。此时应该重启或修复父进程。
快速记忆:
-
R = Ready / Running(准备就绪/正在跑)
-
S = Sleeping(在睡觉,叫得醒)
-
D = Deep sleep(深度睡眠,叫不醒)
-
Z = Zombie(已死,等收尸)
5.5 其他状态速览
| 状态 | 含义 | 说明 |
|---|---|---|
| T | Stopped | 被暂停(如收到Ctrl+Z) |
| t | Tracing stop | 被调试器暂停 |
| X | Dead | 已死亡,即将被回收(极少见) |
| I | Idle | 内核空闲线程(2.6+内核) |
六、综合实战:一个完整的进程排查流程
假设你发现服务器响应变慢,通过以下流程排查:
第一步:快速定位高CPU进程
bash
# 用top看整体
top
# 按P确保按CPU排序,记下占用最高的PID
第二步:查看该进程详情
bash
ps aux | grep <PID>
# 确认是什么服务,谁启动的
第三步:观察进程状态
bash
# 查看是否有大量D状态进程(I/O瓶颈)
ps aux | awk '$8 ~ /D/ {print}' | wc -l
# 查看是否有僵尸进程
ps aux | awk '$8 ~ /Z/ {print}'
第四步:持续监控
bash
# 用htop进行交互式分析
htop
# 按F5看进程树,找出是谁fork出的问题进程
七、本篇小结
今天我们建立了进程管理的核心认知框架:
基础概念:
-
程序是静态文件,进程是动态执行过程
-
每个进程有唯一的PID
查看工具:
-
ps aux:进程快照,适合脚本处理和精准查询 -
top:实时监控,适合持续观察和快速操作 -
htop:top增强版,界面友好,支持鼠标和进程树
进程状态:
-
R:正在运行或等待运行
-
S:可中断睡眠(最常见)
-
D:不可中断睡眠(I/O等待,kill不掉)
-
Z:僵尸(已死等收尸,不占资源)
动手练习
bash
# 1. 查看当前所有进程,找出占用CPU最高的3个
ps aux --sort=-%cpu | head -4
# 2. 运行top,练习使用P、M、k、q快捷键
top
# 按P → 观察CPU排序
# 按M → 观察内存排序
# 按q → 退出
# 3. 安装并运行htop,体验鼠标操作
sudo apt install htop -y # 或 dnf/yum install htop
htop
# 4. 查看系统中有没有僵尸进程
ps aux | awk '$8 ~ /Z/ {print}'
八、下篇预告
今天学会了"看"进程,但光看不够------你还需要能"控制"进程。
下一篇我们将深入进程的前后台切换与信号控制。你将学到:
-
如何把正在运行的命令放到后台(
Ctrl+Z、bg) -
如何把后台任务调回前台(
fg) -
kill命令的本质(不是"杀死",而是"发信号") -
nohup和screen如何让程序在退出终端后继续运行
掌握这些技能,你将能灵活调度系统中的任何任务。
延伸思考 :执行ps aux | grep init,看看系统第一个进程(PID=1)是什么。在现代Linux中,它通常是systemd或init。这个进程是所有其他进程的"祖先",它有什么特殊之处?提示:如果PID=1的进程死了,整个系统就会崩溃。