Linux进程状态全解析:从R/S/D/Z到内核调度与排查实战
两三年前我第一次遇到一批D状态进程堆积在服务器上的场景时第一反应是找应用日志、分析服务线程折腾了一个多小时毫无头绪最后才发现问题是宿主机存储链路超时所有进程都在等底层磁盘回包。那次之后我才真正意识到ps命令STAT列那一个字母可能是整个Linux系统里最应该优先读懂的信息。Linux进程状态看起来只是ps aux输出里的一个小列但它是内核给进程做的人生阶段标记。R、S、D、T、Z、X这几个字母背后对应着进程在内核调度器里的真实位置能不能上CPU、在等什么东西、是不是已经死了还没被收尸。这篇文章我把进程状态的底层逻辑、每种状态的实际表现、排查手段和常见误判全部拆开讲一遍适合刚接触Linux的读者也适合日常被D状态和僵尸进程折磨的运维同学当排查笔记用。1. 状态字母不是ps现算的它来自内核的一块人事档案1.1 task_struct里的state字段进程到底处于哪个阶段Linux里每个进程都对应内核中的一个结构体task_struct官方叫进程描述符。你可以把它理解成这个进程在内核中的人事档案档案里记录着PID、父进程PID、调度优先级、打开的文件表、内存区域、信号处理器还有我们这篇文章的核心字段——state。就是state这个字段用来记录进程当时处于哪一个运行阶段。state字段在源码include/linux/sched.h里由一系列宏定义每个状态对应一个数值#define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 #define __TASK_STOPPED 4 #define __TASK_TRACED 8 #define TASK_DEAD 64 #define TASK_KILLABLE (TASK_UNINTERRUPTIBLE | TASK_WAKEKILL)这里必须强调一个容易误会的点所谓睡眠不是说进程在犯困。内核里把TASK_INTERRUPTIBLE称为可中断睡眠把TASK_UNINTERRUPTIBLE称为不可中断睡眠这里的睡眠是指进程主动让出了CPU把自己从调度器的可运行队列里摘下来等待某个条件满足后再被唤醒。调度器挑选下一个要执行的进程时只会从TASK_RUNNING状态的那些进程里选S状态和D状态进程没有资格参与调度所以它们不消耗CPU时间。很多人刚接触时会问为什么一台机器上几百个进程ps里几乎全是SR只有一两个答案就在这。绝大多数进程平时都在等待事件——等用户输入、等网络包、等定时器到点它们并不需要CPU所以都处在睡眠状态。这不是系统偷懒恰恰是高效的表现。1.2 ps和top是如何把状态字母读出来的ps并不是从内核内存里直接读取task_struct的而是走/proc文件系统。每个进程在/proc下都有一个以PID命名的目录其中有几个文件暴露了进程的运行状态/proc/pid/stat一长串数字和括号内的进程名其中第3个字段就是状态字母/proc/pid/status有一行State:格式更友好比如State: S (sleeping)。我们敲ps aux或者top底层逻辑就是遍历/proc下这些文件把内核记录的状态数值翻译成给人看的字母。请记住这个结论状态字母是内核记录的ps和top只是翻译官。这也引出一个实战中常见的坑因为状态是采样读取的不同工具的采样时机不同结果可能出现差异。最典型的是同一个进程top里看是Dps里看却是S。这不是系统错乱更不是进程在频繁切换状态而是你在两次采样的瞬间进程恰好处于一个中间过渡阶段。排查进程状态时不要拿一次采样就下结论多观察几个周期再结合/proc/pid/wchan看它阻塞在哪个内核函数上才有判断依据。下面这张表是每个字母对应的内核状态、含义和常见触发场景建议收藏当速查表用ps输出内核宏中文含义常见触发场景RTASK_RUNNING运行或可运行正在使用CPU或在运行队列排队等待STASK_INTERRUPTIBLE可中断睡眠等待输入、等待网络数据、等待定时器DTASK_UNINTERRUPTIBLE不可中断睡眠等待磁盘I/O完成、等待存储设备响应TTASK_STOPPED暂停收到SIGSTOP信号或被调试器暂停tTASK_TRACED被跟踪正在被调试器追踪断点停下ZTASK_DEADEXIT_ZOMBIE僵尸子进程已退出父进程还没调用wait回收XTASK_DEADEXIT_DEAD退出进程正在彻底消亡几乎看不到2. R和S最常见的两个状态隐藏着不少误判陷阱2.1 R状态不是正在CPU上跑而是随时能跑R状态对应TASK_RUNNING但这个状态包含两种子情况一种是进程真的正占着某个CPU核心在执行指令另一种是进程在运行队列里排队等调度器分配CPU。换句话说R状态准确翻译是可运行的它不代表进程此时此刻百分百在用CPU。这解释了为什么你会在top里看到某些进程CPU占用是百分之百而另一些R状态进程CPU占用却是0%。在单核或多核机器上同一时刻能真正执行的进程数量等于CPU核心数不考虑超线程的细节但运行队列里可以排着几十个R状态的进程。它们都准备好了只是还没轮到。排查系统高负载时R状态的数量比CPU利用率本身更关键。当top显示负载平均值很高但CPU空闲也不少时你去看运行队列长度往往会发现大量R状态进程在排队。这种情况下引起高负载的往往不是CPU算力不够而是调度器上下文切换太频繁或者锁竞争太严重进程一直在被换进换出始终没有完整执行的机会。这里分享一个实测经验我曾经排查过一台负载均值飙到几十的机器孤立的从CPU看只有50%左右ps里R状态进程特别多。当时第一直觉以为是CPU不足后来缩小进程范围才发现是有个后台进程在疯狂创建短生命周期线程线程数直达上限创建和销毁过程本身占用了大量调度开销。这就是只看CPU不看R状态队列长度会错过的典型情况。2.2 S状态进程在等某件事但信号随时能把它叫醒S状态对应的TASK_INTERRUPTIBLE绝大多数普通进程大部分时间都停在这个状态。S表示进程正在等待某个事件终端输入、网络socket数据、定时器到点、磁盘I/O完成、父进程发来信号都可能是它等待的对象。这个状态的关键特征是可中断——当信号送达时进程会被唤醒去处理信号哪怕它等待的那个事件还没发生。这就是S状态和D状态最本质的区别一个S状态的进程你发一个SIGKILL给它内核会先唤醒它让它去处理信号终止流程而D状态进程即使收到SIGKILL也会暂时搁置因为它正卡在内核态的一个不可被打断的操作里。这也是为什么杀进程杀不掉这个问题绝大多数D状态进程都会遇到而S状态进程几乎不会有这种困扰。观察S状态的进程还有个实用技巧看/proc/pid/wchan文件。这个文件会显示进程阻塞在哪个内核函数上。比如一个进程卡在do_wait上说明它正在等待子进程退出卡在pipe_read上说明它在等管道输入卡在futex_wait上说明它在等一把互斥锁。这套信息在定位应用线程卡顿原因时非常有用因为你可以直接看到内核层面它到底在等谁。2.3 采样视角带来的误判S进程很多不代表系统没事需要提醒的是S状态数量多从来不能说明系统健康。恰好相反如果某个转发类或数据类服务的大量进程全部处于S状态通常意味着它们正在等待某个资源而这个资源可能已经成为了瓶颈。比如数据库连接池耗尽时应用线程会全部阻塞在连接socket的读取上ps里表现为一片S网络带宽打满时收发线程也会长时间处于S状态。所以看到大量S时不要下意识觉得反正它们在睡觉没事。要结合等待的具体事件去判断进程是在正常等待低频事件还是都在挤同一个瓶颈资源。区分方法就是前面说的查wchan把一批进程的wchan汇总一下如果绝大多数都堵在同一类内核函数上那瓶颈就找到了。3. D状态最让运维头疼的不可中断难题3.1 D状态到底是怎么产生的D状态对应的内核宏是TASK_UNINTERRUPTIBLE翻译过来就是不可中断睡眠。这个状态的产生路径简单说就是进程在内核态执行某个操作时这个操作不能被打断所以进程暂时不许进信号处理流程只能等操作结束。哪些操作会这样最常见的是同步磁盘I/O。进程发起一个read或write系统调用底层驱动把请求发给磁盘控制器进程就进入D状态等着数据返回。正常情况下这个等待非常短暂几乎一瞬间就完成你不会在ps里看到它。只有两种情况会让D状态变得扎眼一是I/O设备响应极慢比如存储系统出问题磁盘控制器不回复了二是I/O一直不返回进程只能一直卡在D状态里。需要补充的是D状态不止出现在磁盘I/O上。NFS这种网络文件系统典型容易踩坑——网络文件系统的I/O路径里进程同样可能陷入TASK_UNINTERRUPTIBLE。虚拟化环境里如果宿主机存储链路有问题虚拟机里的进程也可能因为后端存储驱动超时大量进入D状态。我在文章开头说的那次排查就是云主机存储链路故障导致一批进程全部卡在D状态应用日志里却什么都看不出来。3.2 为什么D状态进程连kill -9都杀不掉这是D状态最让人抓狂的地方。很多新手都会疑惑不是还有kill -9吗物理机上的进程难道还有杀不掉的原理其实并不复杂。信号处理依赖进程从内核态返回用户态。正常情况下进程执行系统调用时陷入内核处理完返回用户态之前内核会检查当前是否有待处理的信号有的话就先处理信号再返回用户态继续执行。这是S状态进程能被信号唤醒的原因。但D状态进程卡在内核里的那个操作是不可中断的内核不会在它返回用户态之前检查信号因为按照设计这个操作必须完整执行完。于是极端情况就出现了进程卡在D状态信号被挂起但没人去处理它因为进程根本没机会回到用户态。从外部看就是kill -9发过去进程纹丝不动。这恰恰说明D状态的设计初衷是保护数据完整性——如果允许在磁盘I/O中间打断进程文件系统数据结构可能处于半更新状态后果比死几个进程严重得多。3.3 排查D状态进程的可用思路和操作清单一旦服务器上出现多个D状态进程建议按下面的顺序排查先确认范围ps -eo state,pid,cmd | grep ^D看看哪些进程处于D状态是个别还是大面积看进程阻塞在哪cat /proc/pid/wchan如果显示成wait_on_page_bit_killable这类函数基本可以确定是等待页缓存I/O如果显示__lock_page_killable说明在等某个内存页解锁看系统I/O情况iostat -x 1观察磁盘的%util、await、svctm判断存储是否已经出现明显延迟排除存储链路如果是云主机或虚拟化环境先确认宿主机的存储状态、磁盘是否进入假死、网络文件系统是否超时D状态持续时间很短时不用太紧张超过几十秒甚至数分钟不恢复要考虑存储链路风险。有一点要特别指出D状态本身不能靠kill解决但不代表只能干等。它背后如果对应存储卡死可以尝试恢复存储、重启存储服务、或者从虚拟化层面迁移实例底层I/O路径恢复后D状态进程通常会自动继续执行。只有极少数情况下D状态永久卡住且无法恢复才需要考虑重启这台机器。3.4 TASK_KILLABLE内核后来做的妥协改进早期内核里D状态确实毫无办法后来内核开发者也意识到有些不可中断的等待场景允许被杀死会更友好于是引入了一个折中状态TASK_KILLABLE。它的实现是TASK_UNINTERRUPTIBLE | TASK_WAKEKILL意思是保持不可中断的特性但允许致命信号SIGKILL把进程唤醒从而终止它。这个状态在ps里显示仍然是D但实际行为略有不同收到SIGKILL时内核会让它中断当前的等待进入退出流程。也就是说你看到某些D状态进程能响应kill -9可能就是因为它实际处于KILLABLE逻辑下。这个改进最大的受益场景正是上面说的NFS这类等待网络文件系统等待超时很久有了KILLABLE至少还能被强制回收不用非得重启整台机器。4. Z状态进程退出后的尾巴怎么收、怎么防4.1 僵尸进程的完整生命周期先明确一个基本概念僵尸进程不是还活着但很虚弱的进程它已经死了只是尸体没处理完。Linux里每个进程退出时并不会立刻把自己从进程表里彻底清除而是先变成一个僵尸等着父进程来收尸。收尸的动作是父进程调用wait()或waitpid()系统调用这个调用会读取子进程的退出状态、释放残余资源然后把这个僵尸从进程表里移除。如果父进程一直不调用wait()也不处理子进程发来的SIGCHLD信号那么子进程就会一直保持在Z状态。你可以把僵尸理解成一个只保留最小信息的占位符PID还在进程表项还在但没有代码、没有内存、没有打开的文件。正因为它占用的资源很少单独一个僵尸不是什么大问题。但问题会累积。如果某个父进程长年累月地不停创建子进程又不好好回收僵尸会越积越多。PID是有上限的当进程表被僵尸塞满新的进程就创建不出来了。遇到这种情况最直接的处理方式是找出僵尸的父进程把它重启掉让僵尸交给负责收养的系统进程去清。对于常驻服务更得从代码层面修复——父进程要注册SIGCHLD处理器并在处理器里调用waitpid()或者直接用子进程为临时服务的场景可以考虑double-fork技巧让僵尸由更上层的init进程来收。4.2 僵尸的检测与清理检测僵尸进程的命令很好记ps aux | awk $8 Z ps -eo ppid,pid,stat,cmd | awk $3 ~ /^Z/第一条找出所有Z状态进程第二条顺便把它们的父进程PID列出来方便定位祸根。清理僵尸进程有两个方向。方向一如果僵尸的父进程还在正常运行你可以尝试向父进程发送SIGCHLD信号让父进程触发自身的信号处理逻辑去回收子进程但前提是父进程代码里没有妥善处理子进程退出这种方式成功率并不高。方向二直接终止父进程僵尸进程的父进程会变成系统的1号进程由它接管并自动执行wait回收僵尸就会被清掉。注意这里说的终止父进程不是无脑kill -9如果父进程是关键服务最好先评估影响面再决定是平滑重启还是重部署。还有一个容易忽略的点某些僵尸进程的父进程就是1号进程但仍然显示为僵尸这种情况多半是系统初始化进程本身也处在异常状态或者系统正在关机流程中。正常的1号进程会实时调用wait()去收养清理孤儿和僵尸一般不会长期堆积。4.3 从代码层面防僵尸的三个习惯与其等僵尸堆起来再救火不如从源头上避免。我在实际项目中总结的预防习惯有三个父进程一定要注册SIGCHLD信号处理器并且在处理器里调用waitpid(-1, status, WNOHANG)循环回收所有已退出的子进程如果业务形态是临时起一个子进程干完活就走而且父进程不关心结果可以考虑让子进程主动调用fork()把自己变成孤儿然后由系统进程去养这样父进程就不用承担回收责任了如果用的是编程语言的高级进程库确认底层封装是否自动做了wait回收避免代码看起来把子进程关了但内核角度它已经变成僵尸的情况。5. T和X状态以及容易被忽略的细节5.1 T状态的两个来源主动暂停与被调试器跟踪T状态对应TASK_STOPPED进程被暂停执行。它的来源主要有两种。第一种是收到SIGSTOP信号。这个信号无法被进程捕获或忽略收到后进程立即被暂停。相应的SIGCONT信号可以让它恢复运行。在shell里把某个前台任务挂起按CtrlZ这个任务就进入T状态。之后在shell里执行fg或bg它会被继续执行状态切回R或S。第二种来源是调试器。当gdb这类调试器通过ptrace系统调用把某个进程接管时进程状态会变成TASK_TRACEDps输出里显示成小写的t而不是大写的T。两者在内核层面略有区别被跟踪的进程即使收到SIGCONT也不一定立刻恢复运行必须等调试器解除跟踪。排查时如果看到小写t先确认是不是有调试器挂在进程上别贸然去发恢复信号那不是信号能解决的问题。有一种T状态的衍生场景值得提一下容器环境里对某个进程执行docker pause实际就是在向容器主进程发送SIGSTOP让整个进程子树都停住。这种暂停状态如果忘了恢复很容易在监控里看到大量的T状态进程一时的误判可能让你误以为服务全部卡死了其实只是忘了执行docker unpause。5.2 X状态为什么你几乎看不到它X状态对应TASK_DEAD准确说是进程退出过程中一个极短暂的阶段内核源码里也叫EXIT_DEAD。进程正常退出时会先进入僵尸状态等父进程完成回收后最终彻底消失。X状态是回收完成、进程项即将从进程表删除的那一瞬间快到你用ps基本抓不到最多在某些内核快照或ftrace输出里偶见。既然X状态几乎不可见为什么还要提它因为偶尔会在ps输出里看到某个进程状态是一个大写X如果你不知道这个含义很容易被吓到。真正遇到X状态不要慌也不要去kill它它已经在消亡了继续观察几秒钟通常就会从进程表里消失。如果一直不消失那可能是内核调度器或者/proc读取时的异常重启该进程所属服务即可。5.3 state字段里的位标志影响你对状态的判断最后再补一个偏冷门但重要的细节内核的state字段不是简单单一映射某些条件下同一个值会对应不同表现。比如TASK_STOPPED宏在实现上是__TASK_STOPPED | __TASK_TRACED的组合两个含义共用一个对外状态。还有TASK_KILLABLE它在ps里显示为D但实际能响应致命信号。这意味着你看到的状态字母是对外表现进程的真实处境需要结合/proc/pid/status和wchan字段进一步确认。这部分知识在排查复杂问题时不一定会用到但知道它存在可以避免在某些特殊状态面前迷惑太久。6. 实操用/proc做一个状态跳转变际实验6.1 准备一个最小的实验环境理论讲完亲手观察一次状态跳转比背十遍文档都有效。用一台普通Linux开发机就够了全程不需要任何特殊权限。先起一个“靶子进程”我用一条简单的sleep命令sleep 300 记下它的PID。然后写一个小脚本轮询读取/proc/pid/stat里的第3个字段这个字段就是进程状态字母。注意stat文件里进程名后面的括号可能包含空格所以状态字段不能简单按空格分割建议用awk从右往左数或者直接看status文件grep State /proc/$(pgrep -f sleep 300)/status输出会是State: S (sleeping)6.2 观察S到R、T的状态跳变现在对sleep进程发送一个SIGSTOP信号kill -STOP pid再查看status状态会变成State: T (stopped)这时候进程已经完全暂停。再发送SIGCONT恢复它kill -CONT pid状态会重新变回S (sleeping)。这个实验虽然简单但能直观理解信号对进程状态的影响。想看到R状态可以稍微调整方法写一个高CPU消耗的脚本或者直接执行yes /dev/null它的状态会一直停在R或者对一个sleep进程直接发送SIGCONT时可能短暂显示R然后迅速变回S。用while循环每秒抓一次状态你能亲手看到这个瞬时切换。6.3 制造一个僵尸进程再把它清掉制造僵尸也非常简单。写一段C语言代码故意不回收子进程#include stdio.h #include stdlib.h #include unistd.h int main() { pid_t pid fork(); if (pid 0) { printf(child pid: %d\n, getpid()); exit(0); } else { printf(parent pid: %d\n, getpid()); sleep(300); return 0; } }编译运行后子进程已经退出父进程还在睡觉此时用ps -l能看到子进程状态为Z。接着把父进程kill掉kill -9 parent_pid父进程结束后僵尸子进程会被系统的1号进程收养并回收再查询就看不到Z了。这个实验对理解僵尸进程谁来负责回收非常直观。6.4 一套顺手的进程状态排查命令最后把我日常排查用的命令组合统一整理一份遇到问题直接套用# 查看所有进程状态分布 ps -eo stat | sort | uniq -c # 只看R状态进程按CPU使用率排序 ps -eo stat,pid,pcpu,cmd --sort-pcpu | awk $1 ~ /^R/ # 只看D状态进程 ps -eo state,pid,wchan:32,cmd | awk $1 D # 只看僵尸进程及其父进程 ps -eo ppid,pid,stat,cmd | awk $3 ~ /^Z/ # 查看单个进程阻塞在内核的哪个函数 cat /proc/pid/wchan # 周期采样进程状态变化 while true; cat /proc/pid/status | grep State; sleep 0.5; done这套组合覆盖了从宏观分布到微观阻塞点的排查链路是我在排障时反复使用的固定操作。对你来说先把状态字母背后那套内核逻辑理解透再配合这几条命令观察几次真实场景进程状态相关的排查基本就能做到心里有数。

相关新闻

Linux下SQL Server分区实战:性能优化与I/O协同

Linux下SQL Server分区实战:性能优化与I/O协同

1. 项目概述:为什么在 Linux 上谈 SQL Server 分区,不是“炫技”,而是刚需SQL Server On Linux 自 2017 年正式发布以来,已从“能跑”走向“稳跑”,再到如今的“高效跑”。但很多团队在迁移或新建 Linux 环境下的 SQL …

2026/10/13 7:25:02 阅读更多 →
NModbus Tools 实战:Modbus RTU/TCP 调试与避坑指南

NModbus Tools 实战:Modbus RTU/TCP 调试与避坑指南

简介:NModbus Tools 是一套基于 NModbus4 开源库构建的 Modbus 协议工具集,面向工业自动化领域的开发者、测试工程师及工控学习者,用于串行链路、TCP 网络与协议报文数值的处理。它可帮助使用者完成 Modbus RTU 与 Modbus TCP 的数据读写、报…

2026/10/13 7:25:02 阅读更多 →
Android Studio调试全攻略:断点、日志与性能分析

Android Studio调试全攻略:断点、日志与性能分析

调试这件事,可能是Android开发里最容易被低估的一项技能。很多朋友能熟练写业务代码,但一碰上崩溃、卡顿、数据诡异变化,就只能在代码里四处加日志、猜原因,效率低不说,还容易改出新的问题。我最早也是这样&#xff0c…

2026/10/13 7:25:02 阅读更多 →

最新新闻

RNOH TextInput 适配实战:属性映射、受控行为与中文输入法问题

RNOH TextInput 适配实战:属性映射、受控行为与中文输入法问题

1. 先说背景:TextInput 在 RNOH 组件体系中的位置1.1 为什么输入组件是跨端项目里最烧时间的一环跨端开发做得久了,你会发现一个规律:页面上那些花哨的动效、复杂的布局,解决起来其实都有套路,真正消耗大量调试时间的往…

2026/10/13 8:09:32 阅读更多 →
DM7客户端工具WIN64使用指南:环境配置、数据迁移与排错实战

DM7客户端工具WIN64使用指南:环境配置、数据迁移与排错实战

简介:DM7客户端工具WIN64是一款面向64位Windows操作系统的达梦数据库V7管理客户端,主要服务对象是数据库管理员、开发人员以及需要维护达梦库的技术工程师,解决他们在生产环境中连接数据库、执行SQL、管理对象与保障数据安全时的操作便利性问…

2026/10/13 8:09:32 阅读更多 →
PyQt5+MySQL轻量人事管理系统:从数据库设计到打包部署

PyQt5+MySQL轻量人事管理系统:从数据库设计到打包部署

简介:简易人事管理系统基于PyQt5与MySQL实现,面向初学桌面端开发与数据库联调的开发者,也适合作为ERP系统中人事模块的参考方案。资源包含完整的员工、部门、薪资、登录验证等管理界面与逻辑,通过Python脚本和SQL文件即可运行与二…

2026/10/13 8:09:32 阅读更多 →
四旋翼无人机仿真与控制:MATLAB与SolidWorks联合开发实践

四旋翼无人机仿真与控制:MATLAB与SolidWorks联合开发实践

1. 项目背景与核心价值四旋翼飞行器的仿真与控制一直是无人机开发领域的关键环节。传统开发流程中,MATLAB/Simulink负责算法验证,而SolidWorks承担机械设计,两者往往独立进行导致效率低下。这个项目打通了从多体动力学仿真到三维模型控制的完…

2026/10/13 8:09:32 阅读更多 →
SpringBoot+Vue私房菜定制上门服务系统:全栈毕设项目实战解析

SpringBoot+Vue私房菜定制上门服务系统:全栈毕设项目实战解析

每年毕设季都有很多同学在选题边缘反复横跳:想做个前后端分离的项目,又怕工作量太大hold不住;想做商城系统,又觉得太泛滥没新意。今天聊的这个项目方向——SpringBoot Vue 私房菜定制上门服务系统管理平台,恰好属于那…

2026/10/13 8:09:32 阅读更多 →
Claude Code稳定使用指南:小任务、短会话、严审查

Claude Code稳定使用指南:小任务、短会话、严审查

最近两三周,我几乎把 Claude Code 用成了日常开发里最顺手的帮手。但说实话,刚上手那几天它并没有宣传里那么“开箱即用”:会话动不动就把上下文搞丢,改到一半的代码稍微切换一下任务就忘了自己刚才在干什么,碰上一个稍…

2026/10/13 8:08:32 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →