【Linux从入门到精通】第11篇:进程管理入门——认识正在运行的“灵魂”

目录

一、引言:程序是死的,进程是活的

[二、ps aux:进程快照的瑞士军刀](#二、ps aux:进程快照的瑞士军刀)

[2.1 为什么是 ps aux 而不是 ps -ef?](#2.1 为什么是 ps aux 而不是 ps -ef?)

[2.2 字段逐一拆解](#2.2 字段逐一拆解)

[2.3 常用组合技](#2.3 常用组合技)

三、top:实时的系统监控仪表盘

[3.1 启动与退出](#3.1 启动与退出)

[3.2 界面解读](#3.2 界面解读)

[3.3 核心交互快捷键](#3.3 核心交互快捷键)

四、htop:top的全面增强版

[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命令时,系统会做以下几件事:

  1. 在磁盘上找到/usr/bin/ls这个二进制程序

  2. 把它加载到内存中

  3. 分配一个唯一的PID(进程ID)

  4. 开始执行

  5. 执行完毕后,进程消亡,内存释放

理解了这个基本模型,我们接下来学习如何"看"这些正在运行的进程。

二、ps aux:进程快照的瑞士军刀

2.1 为什么是 ps aux 而不是 ps -ef?

ps(process status)是查看进程状态的基础命令。你可能会看到两种主流用法:ps auxps -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 auxSTAT 列或topS列,你会看到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+Zbg

  • 如何把后台任务调回前台(fg

  • kill命令的本质(不是"杀死",而是"发信号")

  • nohupscreen如何让程序在退出终端后继续运行

掌握这些技能,你将能灵活调度系统中的任何任务。


延伸思考 :执行ps aux | grep init,看看系统第一个进程(PID=1)是什么。在现代Linux中,它通常是systemdinit。这个进程是所有其他进程的"祖先",它有什么特殊之处?提示:如果PID=1的进程死了,整个系统就会崩溃。

相关推荐
wuminyu2 小时前
专家视角看 Java 字节码与Class 文件格式
java·linux·c语言·jvm·c++
skywalk81632 小时前
AtomCode AI 编程助手尝试在linux下安装(未完成)
linux·运维·服务器
Gauss松鼠会2 小时前
【openGauss】openGauss 磁盘引擎之 ustore
java·服务器·开发语言·前端·数据库·经验分享·gaussdb
拾贰_C2 小时前
【Ubuntu | Anaconda | miniconda3】寻找已存在的 |miniconda3|
linux·运维·ubuntu
feng_you_ying_li2 小时前
linux之环境变量
linux·运维·服务器
Garfield20052 小时前
VSCode SSH 连接远程服务器后,Codex 插件登录失败
服务器·vscode·ssh·claude·codex
NaMM CHIN2 小时前
linux redis简单操作
linux·运维·redis
猫头虎2 小时前
楚存科技CSD32GAZIGY SD NAND贴片式TF卡深度评测:小身材大容量,嵌入式存储新选择
linux·服务器·网络·人工智能·windows·科技·芯片
IT布道2 小时前
[GitLab] 项目源码迁移踩坑记
运维·gitlab