Linux 进程状态与进程管理命令

Linux 进程状态与进程管理命令

在 Linux 系统中,进程是程序的运行实例,是操作系统资源分配和调度的基本单位。进程从创建到终止会经历多种状态,通过进程管理命令可以查看、监控和控制这些状态。本教程将结合核心命令,全方位讲解进程状态及管理方法。

一、背景知识与原理

1. 进程的生命周期

一个进程的完整生命周期分为 创建(Fork)→ 运行 → 等待 → 终止 四个阶段,每个阶段对应不同的进程状态。Linux 内核通过 task_struct 结构体(进程控制块,PCB)管理进程的所有信息,其中包含进程状态标识。

2. 进程的核心状态分类

Linux 进程状态可分为 运行态、睡眠态、停止态、僵尸态 四大类,内核用不同的字符标识这些状态(通过 ps 命令查看)。

状态标识 状态名称 核心含义
R 运行态(Running) 进程正在 CPU 上运行,或处于就绪队列等待调度
S 可中断睡眠态(Sleeping) 进程因等待事件(如 I/O、信号)而暂停,收到信号可被唤醒
D 不可中断睡眠态(Uninterruptible Sleep) 进程处于深度睡眠(如磁盘 I/O),不响应信号,强制杀死可能导致数据丢失
T 停止态(Stopped) 进程被信号暂停(如 SIGSTOP),可通过 SIGCONT 信号恢复运行
Z 僵尸态(Zombie) 进程已终止,但父进程未回收其资源(PID、退出状态),占用系统表项资源
X 死亡态(Dead) 进程已完全终止,资源被回收,无法通过命令查看

二、核心进程管理命令与状态查看

1. ps:静态查看进程状态

ps(Process Status)是最常用的进程查看命令,支持多种参数组合,核心功能是列出当前进程的状态、PID、父进程 PID(PPID)等信息。

(1)命令参数拆解
参数 功能说明
aux BSD 风格,查看所有用户的进程,包含 CPU/内存占用率
-ef System V 风格,查看进程的父进程 PID 和完整命令
-l 长格式输出,显示进程状态(S 列)、优先级等详细信息
-o 自定义输出字段,如 pid,ppid,stat,cmd
(2)操作步骤与预期结果

步骤1:查看所有进程的状态(BSD 风格)

bash 复制代码
ps aux

预期结果(关键列解释)

复制代码
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 168124 13248 ?        Ss   08:00   0:02 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    08:00   0:00 [kthreadd]
user      1234  0.5  1.2 234560 98760 pts/0    R    10:30   0:10 /usr/bin/python3 test.py
user      5678  0.0  0.3 189200 24500 pts/1    S+   11:00   0:00 grep --color=auto ps
user      9012  0.0  0.0      0     0 pts/2    Z    11:15   0:00 [test.sh] <defunct>

结果分析

  • STAT 列对应进程状态:Ss 表示会话首进程 的可中断睡眠态;R 表示运行态;S+ 表示前台进程组的可中断睡眠态;Z 表示僵尸态。
  • %CPU/%MEM:进程占用的 CPU 和内存百分比。
  • PID:进程唯一标识,PID=1init 进程(系统首个进程)。

步骤2:查看进程的父进程关系(System V 风格)

bash 复制代码
ps -ef | head -10

预期结果

复制代码
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:00 ?        00:00:02 /sbin/init splash
root         2     0  0 08:00 ?        00:00:00 [kthreadd]
root         3     2  0 08:00 ?        00:00:00 [rcu_gp]

结果分析

  • PPID 列是父进程 PID,PPID=0 表示进程由内核创建。

2. top:动态监控进程状态

top 是实时进程监控工具,默认每 3 秒刷新一次,可查看进程的 CPU 占用、内存占用及状态变化,适合排查性能问题。

(1)命令参数与交互操作
参数/操作 功能说明
top 启动动态监控界面
P 按 CPU 占用率排序
M 按内存占用率排序
k 输入 PID 杀死指定进程
q 退出 top 界面
(2)操作步骤与预期结果

步骤1:启动 top 监控

bash 复制代码
top

预期结果(顶部系统信息 + 进程列表)

复制代码
top - 14:30:00 up 6 days,  6:30,  2 users,  load average: 0.10, 0.05, 0.01
Tasks: 200 total,   1 running, 199 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.2 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7856.0 total,   1200.0 free,   3400.0 used,   3256.0 buff/cache
MiB Swap:   8192.0 total,   7800.0 free,    392.0 used.   3800.0 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 user      20   0  234560  98760  45600 R   5.0  1.2   0:10.50 python3
    1 root      20   0  168124  13248   9800 S   0.0  0.2   0:02.10 init

结果分析

  • 顶部 Tasks 行:显示总进程数、运行态(running)、睡眠态(sleeping)、停止态、僵尸态数量。
  • 进程列表 S 列:对应进程状态,R 表示当前占用 CPU 的进程,S 表示睡眠态。

3. pstree:树形查看进程关系

pstree 以树形结构展示进程的父子关系,便于直观理解进程的衍生链,可结合 -p 参数显示 PID。

操作步骤与预期结果
bash 复制代码
pstree -p root

预期结果

复制代码
systemd(1)─┬─accounts-daemon(123)───{accounts-daemon}(124)
           ├─atd(456)
           ├─cron(789)
           └─sshd(1011)─┬─sshd(2022)───bash(2023)───pstree(3030)
                        └─sshd(2025)───bash(2026)

结果分析

  • systemd(1) 是根进程,所有进程都是其后代。
  • 子进程缩进显示,大括号 {} 内是线程。

三、进程状态的转换与管理

通过信号(Signal)和管理命令,可主动改变进程状态,以下是常见状态转换场景及操作方法。

1. 运行态 ↔ 停止态转换

使用 kill 命令发送信号控制进程启停,核心信号:

  • SIGSTOP(信号 19):暂停进程,进入停止态(T)。
  • SIGCONT(信号 18):恢复暂停的进程,回到运行态或就绪态。
操作步骤
  1. 查看目标进程 PID(以 sleep 1000 为例)

    bash 复制代码
    sleep 1000 &  # 后台运行进程
    ps aux | grep sleep

    预期输出:user 4000 0.0 0.0 6320 420 pts/0 S 15:00 0:00 sleep 1000

  2. 发送 SIGSTOP 信号暂停进程

    bash 复制代码
    kill -19 4000
    ps aux | grep sleep

    预期输出:user 4000 0.0 0.0 6320 420 pts/0 T 15:00 0:00 sleep 1000

    状态由 S 变为 T(停止态)。

  3. 发送 SIGCONT 信号恢复进程

    bash 复制代码
    kill -18 4000
    ps aux | grep sleep

    预期输出:user 4000 0.0 0.0 6320 420 pts/0 S 15:00 0:00 sleep 1000

    状态由 T 变回 S(睡眠态)。

2. 僵尸进程的处理

僵尸进程(Z 态)无法被 kill -9 直接杀死,需通过杀死父进程重启父进程 ,让内核的 init 进程(PID=1)接管并回收资源。

操作步骤
  1. 模拟僵尸进程(子进程先终止,父进程未回收)

    bash 复制代码
    # 编写测试脚本 zombie.sh
    #!/bin/bash
    sleep 1 &  # 子进程
    echo "子进程 PID: $!"
    sleep 100  # 父进程睡眠,不回收子进程
  2. 运行脚本并查看僵尸进程

    bash 复制代码
    chmod +x zombie.sh
    ./zombie.sh &
    ps aux | grep defunct

    预期输出:user 5001 0.0 0.0 0 0 pts/0 Z 15:10 0:00 [sleep] <defunct>

  3. 杀死父进程(回收僵尸进程)

    bash 复制代码
    # 查找父进程 PID(PPID 对应僵尸进程的父进程)
    ps -ef | grep zombie.sh
    kill -9 5000  # 杀死父进程
    ps aux | grep defunct  # 再次查看,僵尸进程消失

3. 不可中断睡眠态(D 态)的处理

D 态进程通常是因为磁盘 I/O 阻塞,禁止强制杀死(可能导致数据损坏),正确做法是等待 I/O 完成或排查存储故障。

  • 排查方法:使用 iostat 查看磁盘 I/O 状态,使用 dmesg 查看内核日志。
相关推荐
doris6102 小时前
2025年设备管理系统:智能运维成新标杆
运维
qsjming2 小时前
EXT4文件系统特性说明
运维
码农12138号2 小时前
Bugku HackINI 2022 Whois 详解
linux·web安全·ctf·命令执行·bugku·换行符
Joren的学习记录3 小时前
【Linux运维进阶知识】Nginx负载均衡
linux·运维·nginx
用户2190326527353 小时前
Java后端必须的Docker 部署 Redis 集群完整指南
linux·后端
胡先生不姓胡3 小时前
如何获取跨系统调用的函数调用栈
linux
Jtti3 小时前
服务器防御SYN Flood攻击的方法
运维·服务器
2501_941982053 小时前
RPA 的跨平台部署与统一自动化策略
运维·自动化·rpa
b***25113 小时前
电池自动分选机:精密分选保障新能源产业质量核心
运维·自动化·制造