【Linux】进程管理详解

一、进程的基本概念

1. 进程与程序的区别
  • 程序:静态的可执行文件(如/bin/ls),存储在磁盘上,包含指令和数据。
  • 进程:程序加载到内存后的动态执行实例,拥有独立的内存空间、CPU 时间片和系统资源(如文件描述符)。一个程序可对应多个进程(如多个bash终端)。
2. 进程标识(PID 与 PPID)
  • PID(Process ID):每个进程的唯一数字标识(由内核分配,范围通常为 1~32768),用于区分不同进程。
  • PPID(Parent PID):父进程的 ID,标识创建当前进程的进程(如用户登录后,bash进程是用户执行命令的父进程)。
  • 特殊 PID:PID=1 是init(Systemd)进程,为所有进程的 “祖先”,负责系统初始化和进程管理。
3. 进程状态

进程在生命周期中会处于不同状态,通过ps命令的STAT字段标识,常见状态如下:

状态符号含义说明
R(Running)运行中或就绪(等待 CPU 调度),处于该状态的进程要么正在执行,要么已就绪等待分配 CPU。
S(Sleeping)可中断睡眠(等待事件完成,如 IO 操作),可被信号唤醒(如kill命令)。
D(Disk Sleep)不可中断睡眠(深度睡眠,通常为等待磁盘 IO),不能被信号唤醒,需等待 IO 完成。
T(Stopped)暂停状态,通常由Ctrl+Zkill -STOP触发,可通过kill -CONT恢复运行。
Z(Zombie)僵尸状态,进程已终止,但父进程未回收其资源(PID 等),需回收父进程或重启父进程清除。
<(High Priority)高优先级进程(优先级高于普通进程)。
N(Low Priority)低优先级进程(优先级低于普通进程)。
+(Foreground)前台进程(与终端关联,如直接执行的ls),后台进程无此标记。

二、进程的查看与监控

1. ps:静态查看进程快照

ps(Process Status)用于查看某一时刻的进程状态,支持多种选项组合:

常用命令功能说明
ps aux显示系统中所有进程(a:所有用户进程;u:显示用户信息;x:包括无终端进程)。
ps -ef以全格式显示进程(-e:所有进程;-f:全字段,包括 PPID、CMD 等)。
ps -l显示当前终端的进程详情(包含优先级、状态等)。

输出字段解读ps aux):

ps -ef 指令显示内容如下:

  • USER:进程所属用户。
  • PID:进程 ID。
  • %CPU:进程占用 CPU 的百分比。
  • %MEM:进程占用内存的百分比。
  • VSZ:虚拟内存大小(KB),包括所有代码、数据、共享库和未使用的交换空间。
  • RSS:物理内存使用量(KB),实际占用的内存。
  • TTY:进程关联的终端(?表示无终端,通常为守护进程)。
  • STAT:进程状态(见上文)。
  • START:进程启动时间。
  • TIME:进程累计占用的 CPU 时间。
  • COMMAND:启动进程的命令(包括参数)。
  • UID: 用户ID
  • PID进程 ID
  • PPID: 父进程ID
  • C: CPU 用于计算执行优先级的因子。 数值越大,表明进程是 CPU 密集型运算,执行优先级会降低; 数值越小,表明进程是 I/O 密集型运算,执行优先级会提高
  • STIME :进程启动的时间
  • TTY :完整的终端名称
  • TIME: CPU 使用时间
  • CMD:启动进程所用的命令和参数
2. top:动态监控进程(实时更新)

top 以交互式界面实时显示进程状态(默认每 3 秒更新一次),适合监控系统负载和资源占用。

界面分区

  • 顶部系统信息
    • 第一行:当前时间、系统运行时间、登录用户数、系统负载(1/5/15 分钟平均负载,数值接近 CPU 核心数为正常)。
    • 第二行:进程总数(total)、运行中(running)、睡眠(sleeping)、停止(stopped)、僵尸(zombie)数量。
    • 第三 / 四行:CPU 和内存使用情况(%us用户态 CPU,%sy内核态 CPU,%id空闲 CPU)。
  • 底部进程列表:与ps类似,默认按 CPU 使用率排序。

常用交互命令

  • P:按 CPU 使用率排序(默认)。
  • M:按内存使用率排序。
  • T:按累计 CPU 时间排序。
  • k:输入 PID 并发送信号(如终止进程)。
  • q:退出top
3. htop:增强版top(推荐)

htop 是top的改进版,支持鼠标操作、彩色显示、进程树视图等,需单独安装(yum install htop 或 apt install htop)。

  • 优势:可直接用方向键选择进程,按F9发送信号终止进程,按F5切换进程树视图。
4. pstree:查看进程树(父子关系)

pstree 以树形结构展示进程间的父子关系,直观呈现进程层级:

pstree  # 简洁显示所有进程树
pstree -p  # 显示PID
pstree root  # 只显示root用户的进程树
5. /proc文件系统:查看进程详细信息

Linux 通过/proc/[PID]目录存储每个进程的实时数据(虚拟文件系统,存在于内存中),常用文件:

  • /proc/[PID]/cmdline:进程启动命令及参数。
  • /proc/[PID]/status:进程状态(包括 PID、PPID、内存使用、状态等)。
  • /proc/[PID]/cpuinfo:进程使用的 CPU 核心信息。
  • /proc/[PID]/fd:进程打开的文件描述符(链接到实际文件)。

示例:查看 PID=1234 的进程命令:

cat /proc/1234/cmdline

三、进程的控制与管理

1. 进程的启动
  • 前台启动:直接执行命令(如ls),进程占用终端,需等待执行完成才能输入新命令。
  • 后台启动:命令后加&,进程在后台运行,终端可继续使用(输出仍会显示在终端):
    sleep 100 &  # 后台运行100秒的睡眠进程
    
  • 脱离终端启动:用nohup(忽略挂起信号),确保进程在终端关闭后继续运行,输出默认写入nohup.out
    nohup ./script.sh &  # 后台启动脚本,终端关闭后不终止
    
2. 进程的暂停与恢复
  • 暂停进程:在前台进程执行时按Ctrl+Z,进程进入T(停止)状态,退回终端。
  • 查看后台任务jobs命令显示当前终端的后台任务([任务号] 状态 命令):
    jobs  # 输出示例:[1]+  Stopped  sleep 100
    
  • 恢复前台运行fg %任务号%可省略,任务号从jobs获取):
    fg 1  # 将任务1恢复到前台运行
    
  • 恢复后台运行bg %任务号,将暂停的进程转为后台运行:
    bg 1  # 任务1在后台继续运行
    
3. 进程的终止(发送信号)

通过killpkillkillall命令向进程发送信号(Signal)终止或控制进程,常用信号:

信号编号信号名称含义说明
1SIGHUP挂起信号(如终端关闭),常用于重启进程(如nginx重载配置)。
9SIGKILL强制终止信号,进程无法忽略,用于强制杀死无响应的进程(“必杀信号”)。
15SIGTERM终止信号(默认),进程可捕获并优雅退出(释放资源后终止,推荐优先使用)。
19SIGSTOP暂停信号,进程进入T状态,需SIGCONT恢复。
18SIGCONT继续信号,恢复被暂停的进程。

常用命令

  • kill [信号] PID:向指定 PID 的进程发送信号(默认信号 15):

    kill 1234  # 发送SIGTERM(15)终止PID=1234的进程
    kill -9 1234  # 发送SIGKILL(9)强制杀死PID=1234的进程
    
  • pkill [信号] 进程名:按进程名匹配并发送信号(支持模糊匹配):

    pkill -9 sleep  # 强制杀死所有名为sleep的进程
    
  • killall [信号] 进程名:与pkill类似,但需完全匹配进程名:

    killall -1 nginx  # 向所有nginx进程发送SIGHUP(重启配置)
    

四、进程调度与优先级

Linux 内核通过调度器分配 CPU 时间片给进程,确保多进程 “并发” 运行(宏观并行,微观串行)。

1. 调度策略
  • CFS(Completely Fair Scheduler,完全公平调度器):默认调度策略,针对普通进程(非实时),按 “权重” 分配 CPU 时间,优先级高的进程获得更多时间片。
  • 实时调度策略:针对实时进程(如工业控制),优先级高于 CFS 进程,包括:
    • SCHED_FIFO(先进先出):高优先级进程一旦运行,会一直占用 CPU 直到主动释放。
    • SCHED_RR(时间片轮转):相同优先级的进程按时间片轮流运行。
2. 优先级表示:Nice 值与 PRI
  • Nice 值:用户空间可见的优先级,范围-20(最高)~19(最低),默认值为 0。Nice 值越小,进程优先级越高,获得的 CPU 时间越多。
  • PRI(Priority):内核内部的优先级(动态计算),与 Nice 值相关(PRI = PRI_BASE + Nice值,PRI_BASE 通常为 80),值越小优先级越高。
3. 调整优先级
  • 启动时指定优先级nice命令,格式:nice -n [Nice值] 命令

    nice -n -5 ./high_prio.sh  # 以Nice值-5启动脚本(高优先级)
    
  • 运行中调整优先级renice命令,格式:renice [新Nice值] -p PID

    renice -10 -p 1234  # 将PID=1234的进程Nice值改为-10(提高优先级)
    

五、守护进程(Daemon)

守护进程是在后台长期运行的特殊进程,用于提供系统服务(如sshdhttpd),特点:

  • 脱离终端(TTY字段为?),不受终端关闭影响。
  • 通常以d结尾(如crondnamed)。
  • systemd(或init)管理,系统启动时自动运行。

查看守护进程:

ps aux | grep -E 'sshd|httpd|crond'  # 查看常见守护进程

六、僵尸进程的处理

僵尸进程(Z 状态)是已终止但未被父进程回收的进程,会残留 PID(不占用 CPU / 内存,但过多会耗尽 PID 资源)。

处理方法

  1. 找到其父进程(通过ps -ef | grep 僵尸进程PID查看 PPID)。
  2. 正常情况下,父进程会定期回收子进程,若父进程未响应,重启父进程:
    kill -15 父进程PID  # 优雅重启父进程,触发回收
    
  3. 若父进程无法重启,直接杀死父进程(僵尸进程会被init(PID=1)接管并回收):
    kill -9 父进程PID
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王不想wan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值