0

0

Linux 进程状态全解析

舞夢輝影

舞夢輝影

发布时间:2026-01-23 18:35:03

|

515人浏览过

|

来源于php中文网

原创

R表示运行或可运行,S为可中断睡眠,D为不可中断睡眠,Z是僵尸进程,T是已停止或被追踪。它们对应内核task_struct的state字段,反映进程实时调度状态。

linux 进程状态全解析

进程状态码 R、S、D、Z、T 分别代表什么

Linux pstop 输出里的单字母状态码,是理解进程行为的关键入口。它们不是抽象概念,而是内核 task_struct 中 state 字段的直观映射:

  • R:正在运行(running)或可立即运行(runnable),在就绪队列中排队等 CPU;不等于“正在执行指令”,也包含刚被唤醒未上 CPU 的瞬间
  • S:可中断睡眠(interruptible sleep),等待某事件(如磁盘 I/O 完成、信号、互斥锁释放),能被信号打断并提前退出等待
  • D:不可中断睡眠(uninterruptible sleep),通常卡在内核态底层操作(如块设备驱动、NFS 服务器无响应),不能被任何信号终止,kill -9 也无效
  • Z:僵尸进程(zombie),子进程已退出但父进程尚未调用 wait() 回收其退出状态,只保留一个 task_struct 结构,不占内存也不执行,但会占用 PID
  • T:已停止(stopped)或被追踪(traced),常见于 kill -STOP、调试器断点触发、ptrace 附加时

为什么 ps 看不到 D 状态进程的堆,且无法 kill

D 状态本质是进程阻塞在内核函数里,尚未返回用户空间,因此无法响应信号处理逻辑——信号机制本身依赖进程回到用户态执行 signal handler,而 D 状态下连调度器都绕过它。

  • 典型诱因:硬盘故障导致 I/O 请求长期挂起、NFS 服务器宕机且客户端未设超时、某些驱动 bug(如旧版 RAID 卡驱动)
  • /proc//stack 对 D 进程可能为空或只显示极短内核路径(如 __rq_wait_event),因为尚未进入完整调用链
  • 唯一可靠解法是修复底层资源(如拔掉坏盘、重启 NFS 服务),或重启系统;强行 reboot 可能比等待更早恢复服务

如何区分真正的僵尸进程和 ps 显示异常

Z 状态进程本身无害,但大量存在说明父进程有 bug(未调用 waitpid())或设计缺陷(如 fork 后忘记 wait)。不过要注意误判场景:

kgshop金刚网店系统
kgshop金刚网店系统

KgShop,是国内一款快速/稳定/安全的开源电子商城系统,采用linux,mysql,srutsEX,hibernate,ejb3等技术,Kghop第一版诞生于2010年,经过多年开发,Kgshop系统已拥有快速、稳定、支持大量并发访问等软件特性,是10万人在线的JAVA商城优秀解决方案。KgShop拥有良好的模板机制,易于进行二次开发。Kgshop每一行代码都经过严谨的测试,汇聚大批工程师多年

下载
  • ps aux | grep ' Z ' 精确匹配空格包围的 Z,避免匹配到含 Z 的命令行参数
  • 检查 /proc//stat 第三列:若为 Z 且第八列(PPid)为 1,说明 init(systemd)已接管但仍未回收——这通常是父进程 exit 前就崩溃,由内核托孤所致
  • 真实僵尸不会消耗 CPU 或内存,ps 显示的 RSS/VSZ 均为 0;若看到非零值,大概率是 ps 解析 /proc 出错,或进程刚退出、状态尚未刷新

用 pidstat 和 /proc/pid/status 挖掘更细粒度状态信息

ps 的单字母太粗略,真正排查需深入内核暴露的细节。比如:

  • pidstat -w -p 1 可观察每秒上下文切换次数,若 D 进程伴随极高 cswch/s,说明频繁被唤醒又立刻阻塞,可能是驱动轮询逻辑异常
  • cat /proc//status | grep -E 'State|tgid|ppid|SigQ':其中 State 行末括号内是更准确的状态描述(如 sleeping in nanosleep),SigQ 显示待处理信号数,高值配合 T 状态说明信号积压未处理
  • cat /proc//stack 在非 D 状态下可看完整内核调用栈,但需确保内核编译开启 CONFIG_STACKTRACE,否则为空

进程状态不是静态快照,而是内核调度器与硬件交互的实时投影。最易被忽略的是:同一进程在 ps 刷新间隔内可能跨越多个状态(如 R→S→R),而工具采样只能捕获瞬时值——所以反复观察、结合 I/O 和 CPU 指标交叉验证,比单次截图更有价值。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

393

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

574

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

393

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

574

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1352

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

704

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

777

2023.07.05

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.6万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号