Linux 进程状态全解析
发布时间 - 2026-01-23 00:00:00 点击率:次R表示运行或可运行,S为可中断睡眠,D为不可中断睡眠,Z是僵尸进程,T是已停止或被追踪。它们对应内核task_struct的state字段,反映进程实时调度状态。
进程状态码 R、S、D、Z、T 分别代表什么
Linux ps 或 top 输出里的单字母状态码,是理解进程行为的关键入口。它们不是抽象概念,而是内核 task_struct 中 state 字段的直观映射:
-
R:正在运行(running)或可立即运行(runnable),在就绪队列中排队等 CPU;不等于“正在执行指令”,也包含刚被唤醒未上 CPU 的瞬间 -
S:可中断睡眠(interruptible sleep),等待某事件(如磁盘 I/O 完成、信号、互斥锁释放),能被信号打断并提前退出等待 -
D:不可中断睡眠(uninterr
uptible 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/对 D 进程可能为空或只显示极短内核路径(如/stack __rq_wait_event),因为尚未进入完整调用链 - 唯一可靠解法是修复底层资源(如拔掉坏盘、重启 NFS 服务),或重启系统;强行 reboot 可能比等待更早恢复服务
如何区分真正的僵尸进程和 ps 显示异常
Z 状态进程本身无害,但大量存在说明父进程有 bug(未调用 waitpid())或设计缺陷(如 fork 后忘记 wait)。不过要注意误判场景:
- 用
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/在非 D 状态下可看完整内核调用栈,但需确保内核编译开启/stack CONFIG_STACKTRACE,否则为空
进程状态不是静态快照,而是内核调度器与硬件交互的实时投影。最易被忽略的是:同一进程在 ps 刷新间隔内可能跨越多个状态(如 R→S→R),而工具采样只能捕获瞬时值——所以反复观察、结合 I/O 和 CPU 指标交叉验证,比单次截图更有价值。
# linux
# 硬盘
# 工具
# 栈
# ai
# 状态码
# 为什么
# 命令行参数
# 堆
# signal
# 事件
# bug
# 重启
# 为空
# 的是
# 或可
# 也不
# 状态下
# 多个
# 均为
# 要注意
# 更有
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Swift中switch语句区间和元组模式匹配
php 三元运算符实例详细介绍
Laravel如何使用withoutEvents方法临时禁用模型事件
浅谈Javascript中的Label语句
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
如何用搬瓦工VPS快速搭建个人网站?
如何做网站制作流程,*游戏网站怎么搭建?
jQuery中的100个技巧汇总
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
Android利用动画实现背景逐渐变暗
微信小程序 wx.uploadFile无法上传解决办法
如何在万网ECS上快速搭建专属网站?
EditPlus中的正则表达式实战(5)
制作公司内部网站有哪些,内网如何建网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
如何为不同团队 ID 动态生成多个非值班状态按钮
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
如何在香港服务器上快速搭建免备案网站?
Laravel如何配置Horizon来管理队列?(安装和使用)
JavaScript中的标签模板是什么_它如何扩展字符串功能
Laravel如何自定义错误页面(404, 500)?(代码示例)
Laravel如何发送系统通知?(Notification渠道示例)
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Linux安全能力提升路径_长期防护思维说明【指导】
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Laravel如何使用Vite进行前端资源打包?(配置示例)
如何挑选优质建站一级代理提升网站排名?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
使用Dockerfile构建java web环境
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
JS中对数组元素进行增删改移的方法总结
原生JS获取元素集合的子元素宽度实例
如何用花生壳三步快速搭建专属网站?
如何在 Pandas 中基于一列条件计算另一列的分组均值
电商网站制作价格怎么算,网上拍卖流程以及规则?
Python文件流缓冲机制_IO性能解析【教程】
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
免费视频制作网站,更新又快又好的免费电影网站?
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Laravel怎么判断请求类型_Laravel Request isMethod用法
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Laravel如何实现API速率限制?(Rate Limiting教程)
深入理解Android中的xmlns:tools属性
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】


