程序是保存在磁盘上的静态文件,当程序加载到内存开始执行,就产生进程,通俗来说,用户视角运行中的程序实例就是任务。每个进程(任务)运行时都需要占用 CPU、内存等系统硬件资源。系统中往往同时存在大量进程,硬件资源有限,多个任务之间存在资源竞争。Linux 引入进程这一抽象实体来统一管理运行中的程序:以进程为单位分配内存、文件描述符等资源,依靠独立虚拟地址空间实现进程间内存隔离;内核调度器按照调度算法分配 CPU 时间片,有序协调多个进程竞争 CPU,避免任务无序抢占资源,实现多任务并发运行。在内核内部,所有进程以及进程创建的线程都会被抽象为 task 任务,作为 CPU 调度的最小单元。一、什么是进程
进程,就是一段程序的一次执行实例,是操作系统进行资源分配的基本单位。程序是存放在硬盘上、静态不动的二进制代码文件,安安静静躺在那里,不去运行它,它就永远只是一堆数据,不占用 CPU、不占用运行内存,它仅仅是一个静态的程序文件。当双击运行这个程序,操作系统把程序文件加载进内存、为它分配内存空间、建立相应管理数据结构,分配CPU 开始执行代码,这一刻,静态的程序就转化成了动态的进程。所以说,进程是程序动态运行的过程,是正在运行的实体。进程拥有完整的生命周期。一个进程从诞生到消亡,整个过程分为五种核心状态:创建态、就绪态、运行态、阻塞态、终止态。图1进程的五种核心状态Linux进程在运行中会切换不同状态,通过ps命令可查看状态标识:R(运行态):进程正在CPU上执行,或等待CPU调度。S(睡眠态):可中断睡眠,进程等待资源(如网络、文件、输入),可被信号唤醒。D(阻塞态):不可中断睡眠,进程等待硬件IO(如磁盘读写),无法被唤醒,易导致系统卡顿。读到这里,大家自然会产生一个疑惑:为什么 Linux 的进程状态标识,和我们前面介绍的五种进程状态看起来不一致?我们之前讲的五种核心状态,是通用操作系统理论中的标准抽象模型;而 Linux 内核里 R、S、D、Z、T 这套状态,是操作系统理论在 Linux 上具体的工程实现。Linux 内核根据服务器运行时各种各样真实场景,一方面对理论状态做了拆分细化,另一方面也做了状态合并,同时额外增加了理论模型没有定义的特殊进程状态,因此两套体系不能简单一对一直接等同。二、进程唯一标识(PID)
操作系统内部会维护一张进程管理表,每新建一个进程,内核就会为它创建一块 PCB 进程控制块。为了能够快速查找、区分、调度、管控进程,内核必须给 PCB 绑定一个独一无二的数字编号,这个编号就是 PID。系统中每个进程拥有唯一的PID,取值从1开始。其中PID=1的进程为init/systemd进程,是系统所有进程的父进程,负责初始化系统、管理所有用户进程,不可终止。三、进程分类
Linux系统为了对进程进行差异化管控,让操作系统合理分配资源,对进程进行了分类:前台进程、后台进程、僵尸进程、孤儿进程。前台进程:占用当前终端,实时输出日志,终端关闭则进程终止,默认用户手动执行的命令均为前台进程。后台进程(守护进程):脱离终端运行,无界面输出,终端关闭不影响进程运行,常用于运行服务器、脚本服务等长期任务。僵尸进程:子进程执行完毕,但父进程未回收其资源,进程残留占用PID,不占用CPU和内存,但会浪费系统PID资源。孤儿进程:父进程异常终止,子进程被systemd进程(PID=1)接管,可正常运行,无资源危害。四、进程查看核心命令
1.ps 静态查看进程快照
ps命令用于查看当前时刻系统进程快照,无实时刷新,是排查进程异常的基础命令。# 查看当前终端进程ps# 输出PID TTY TIME CMD3365 pts/0 00:00:00 bash3381 pts/0 00:00:00 ps
PID:Process ID,进程号,操作系统用来唯一标识进程pts/0:伪终端 0(远程 ssh 登录、图形界面终端模拟器都属于 pts 伪终端)若是本机控制台直接登录会显示 tty1/tty2;? 代表无终端(后台守护进程)TIME:进程占用CPU 总运行时间(不是进程启动时长!)00:00:00:这两个进程几乎没有消耗 CPU,只是空闲等待# 查看所有进程(含状态、CPU内存占比,最常用)ps aux# 输出
2、pgrep 筛选进程PID
# 筛选nginx进程PIDpgrep bash# 输出3365# 显示PID+进程名pgrep -l bash# 输出3365 bash
3. pstree 查看进程树
pstree命令以树形结构展示进程之间的父子关系,直观看清进程创建、派生链路。查看进程树
图中的systemd为始祖进程,所有进程由它派生。输出中N*[{进程名}]代表线程,共享进程内存;直接分支代表独立子进程。gdm3 整套进程链对应 GNOME 图形登录与 Wayland 桌面会话;ModemManager、fwupd、colord 等分别管控调制解调器、硬件固件升级、显示器色彩校准;avahi-daemon 存在独立子进程,dbus-daemon 作为进程通信总线支撑系统消息交互。相比 ps 平铺列表,pstree 可直观区分进程与线程,清晰查看进程派生链路,适合排查父子进程、线程相关系统问题。4、进程启停与后台管理
4.1.前台进程转后台运行
前台进程占用终端、阻塞命令输入。前台转后台,就是将已经启动、占用终端的程序,通过Ctrl+Z暂停+bg唤醒,转移至后台持续运行,释放终端供用户输入新指令。后台任务归属当前终端会话,终端关闭后,进程会被终止。例如:#python程序作为后台任务启动python test.py &
在命令启动时末尾添加 &,程序直接作为后台任务启动。终端不会被阻塞,可以立刻输入下一条命令;程序输出默认依旧打印在终端。#查询当前终端所有后台任务Jobs# #示例输出[1] Running python test.py
其中[1]是任务编号,使用D命令,可以将进程转到前台。4.2. 进程终止与杀死
# 正常终止进程(推荐,释放资源、保存数据)kill PID# 强制关闭进程(进程卡死无响应时使用)kill -9 PID# 根据进程名批量杀死进程killall 进程名
4.3.进程优先级调整
Linux进程优先级通过nice值控制,范围-20~19,数值越小,优先级越高,默认nice值为0。# 启动进程时指定优先级(nice值-5)nice -n -5 命令# 修改正在运行进程的优先级renice -n 10 -p PID
五、进程常见问题排查
1. 僵尸进程处理
排查命令:ps aux | grep Z,筛选所有僵尸进程。解决方式:优先杀死僵尸进程的父进程,系统会自动回收僵尸进程;若父进程为systemd,可重启对应服务或系统。2.进程CPU/内存占用过高
1. 通过top命令排序,找到%CPU/%MEM最高的异常进程;2. 通过ps -ef | grep PID 查看进程启动路径、所属服务;3. 若为业务进程,排查代码、日志定位异常;若为无用进程,优雅终止。3.后台进程意外终止
常规后台进程会因终端关闭、会话退出终止,可通过nohup保障进程永久后台运行:永久后台运行,日志输出到nohup.out nohup 命