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 查看内核日志。
相关推荐
`林中水滴`7 分钟前
Linux Shell 命令:nohup、&、>、bg、fg、jobs 总结
linux·服务器·microsoft
appearappear9 分钟前
阿里云同区域不同账户下两个服务器打通内网
服务器·阿里云·云计算
helloworddm11 分钟前
防止应用多开-WPF
服务器·架构·c#
最后一个bug12 分钟前
当linux触发panic后进行自定义收尾回调处理
linux·服务器·系统架构·bug
安当加密25 分钟前
无网环境下的终端登录安全:一个被忽视的等保盲区
服务器·安全
石像鬼₧魂石33 分钟前
服务器安全配置自查清单(可打印版)
运维·服务器·安全
微爱帮监所写信寄信37 分钟前
微爱帮监狱寄信写信小程序信件内容实时保存技术方案
java·服务器·开发语言·前端·小程序
行初心37 分钟前
uos基础 应用商店 查看应用程序的包名
运维
一只旭宝1 小时前
Linux专题十二:mysql数据库以及redis数据库
linux·数据库·mysql
赵民勇1 小时前
paste命令用法详解
linux·shell