在 Linux 中,进程的 状态(State) 是一个非常重要的概念,它描述了进程当前所处的生命周期阶段,这些信息可以通过多种命令查看,最常用的是 ps、top 或 /proc/[pid]/stat 文件。
以下是 Linux 进程常见状态的详细解释:
常见进程状态符号
在 ps 命令的输出中,STAT 列或 /proc/[pid]/stat 文件中的第 3 个字段表示进程状态。
核心状态(单字符)
| 状态符号 | 全称 | 含义 |
|---|---|---|
| R | Running | 运行中,进程正在 CPU 上运行,或者在运行队列中等待被调度。 |
| S | Sleeping | 可中断睡眠,进程正在等待某个事件发生(如 I/O 完成、信号、锁等),收到信号后可被唤醒,这是最常见的状态。 |
| D | Uninterruptible Sleep | 不可中断睡眠,进程正在等待 I/O 操作(通常是磁盘 I/O),此时进程不能被信号中断,即使发送 kill -9 也无法终止,直到 I/O 完成。 |
| T | Stopped | 已停止,进程被暂停,通常是因为收到了 SIGSTOP、SIGTSTP 信号,或者被调试器(如 gdb)跟踪。 |
| Z |
Zombie | 僵尸进程,进程已经终止,但其父进程尚未读取其退出状态(wait()),僵尸进程不占用 CPU 或内存资源,但占用进程号(PID)。 |
| X | Dead | 死亡,进程已彻底终止,即将从系统中移除,通常只在极短时间内出现,几乎看不到。 |
扩展状态(STAT 列中的额外标志)
在 ps 命令的 STAT 列中,除了第一个字符表示核心状态外,后续字符表示进程的附加状态:
| 标志 | 含义 |
|---|---|
| < | 高优先级(High priority)。 |
| N | 低优先级(Low priority)。 |
| s | 会话领导者(Session leader),该进程是其会话的第一个进程。 |
| l | 多线程(Multi-threaded),该进程是多线程的(使用 clone 系统调用)。 |
| 前台进程组(Foreground process group),该进程在前台运行,可以接收终端输入。 | |
| I | 空闲内核线程(Idle kernel thread),仅在内核线程中出现。 |
| k | 内核线程(Kernel thread)。 |
| W | 换页(Paging),进程正在换页,通常出现在早期 Linux 内核中。 |
如何查看进程状态
使用 ps 命令
# 查看所有进程的详细状态 ps aux # 查看特定 PID 的状态 ps -p <PID> -o pid,stat,comm
示例输出:
PID STAT COMMAND
1234 Ss /sbin/init
5678 R+ ps aux
9012 D java -jar app.jar
Ss:可中断睡眠,会话领导者。R+:运行中,前台进程组。D:不可中断睡眠。
使用 top 命令
在 top 界面中,S 列显示进程状态:
R:运行S:睡眠D:不可中断睡眠T:停止Z:僵尸
读取 /proc/[pid]/stat 文件
这是最底层的方式,适用于脚本或程序解析。
cat /proc/<PID>/stat
输出示例:
1234 (bash) S 1233 1234 1234 0 -1 4194304 100 0 0 0 10 5 0 0 20 0 1 0 1234 1234567890 ...
- 第 1 字段:PID
- 第 2 字段:进程名(括号内)
- 第 3 字段:状态(这里是
S)
特殊状态详解
🟢 R(Running)
- 进程正在 CPU 上执行,或正在等待 CPU 调度。
- 如果很多进程处于
R状态,可能表示 CPU 负载高。
🔵 S(Sleeping)
- 大多数用户空间进程处于此状态。
- 进程在等待事件(如网络数据到达、文件读取完成)。
- 可被信号中断。
🟠 D(Uninterruptible Sleep)
- 关键问题:如果大量进程处于
D状态,通常意味着磁盘 I/O 瓶颈
或存储设备故障。 kill -9无效,因为进程在内核态等待 I/O,无法响应信号。- 解决方案:检查磁盘健康、I/O 负载,或等待 I/O 完成。
⚫ Z(Zombie)
- 进程已退出,但父进程未调用
wait()收集退出状态。 - 危害:占用 PID 资源,可能导致系统无法创建新进程。
- 解决方案:
- 通知父进程处理:
kill -SIGCHLD <PPID> - 杀死父进程:
kill -9 <PPID>(子进程会被 init 进程收养并清理)
- 通知父进程处理:
🔴 T(Stopped)
- 进程被暂停,通常用于调试或后台作业控制。
- 可通过
kill -CONT <PID>恢复运行。
常见问题排查
问题:如何查看某个进程的完整状态信息?
# 查看 PID 为 1234 的进程状态cat /proc/1234/status
输出示例:
Name: bash
State: S (sleeping)
Tgid: 1234
Pid: 1234
PPid: 1
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 64
Groups: 27 30 46 100
VmPeak: 12345 kB
VmSize: 12345 kB
VmRSS: 1234 kB
Threads: 1
问题:如何找出僵尸进程?
ps -eo pid,ppid,stat,comm | grep -w Z
问题:如何找出处于 D 状态的进程?
ps -eo pid,ppid,stat,comm | grep -w D
- R:正在运行或等待 CPU。
- S:等待事件(最常见)。
- D:等待 I/O(需关注磁盘健康)。
- T:被暂停。
- Z:僵尸进程(需清理父进程)。
理解进程状态有助于诊断系统性能问题,如 CPU 瓶颈、I/O 瓶颈或资源泄漏。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/477824.html



