排查问题时最让人窝火的一类场景是代码明明没动过昨天还能跑今天npm run dev一敲下去终端甩出一行EADDRINUSE: address already in use然后死死卡在那。多数人第一反应是去翻依赖、清缓存、重装node_modules折腾半小时才想起来——上一轮的npm run dev根本没停干净进程还躺在后台占着端口。这篇就专门聊透怎么停掉或关闭运行的 npm run dev这一件事它到底是个什么进程、为什么有时候按CtrlC跟没按一样、端口被占了怎么精准找到元凶、多个进程并行时又该怎么收场。看似是个新手问题但真在多人协作的项目里、在容器环境里、在远程开发机上踩过几轮的人都知道这里面能翻车的姿势远比想象中多。不管你是刚接触命令行脚本的同学还是已经带过几个项目的老手下面这些定位思路和命令基本都能直接抄。1. 先把这件事说清楚npm run dev 究竟是个什么进程1.1 从一条命令到一棵进程树很多人对npm run dev的认知停留在它启动了项目但实际上你敲下回车的那一刻系统里发生的事情是shell 先拉起一个npm进程npm去读package.json里的scripts字段找到dev对应的那串命令可能是vite、webpack serve、node server.js或者一长串带参数的自定义脚本然后再 fork 出一个子进程来执行它。也就是说你在终端里看到的那个正在跑的开发服务器本质上至少是两层结构npm 父进程 真正干活的应用子进程如果脚本里还串了concurrently、npm-run-all或者nodemon那这就是一棵三层甚至四层的树。这个结构认知非常关键因为它直接决定了几件事第一你看到终端提示符回来不代表子进程真的死了有时候只是父进程退了、子进程被挂到了别处第二你杀掉某一个 PID很可能只砍掉了树上的一个枝桠剩下那个还在默默监听端口第三信号signal在 Unix 体系里是父子进程之间传递的父进程收到信号之后有没有老老实实转发给子进程取决于 npm 的版本、脚本的写法以及操作系统这中间存在一条不太可靠的链路。搞不清这棵树的形态后面所有的排查都是瞎猜。我一般的做法是项目跑起来之后顺手开另一个终端先看一眼这棵树长什么样。Linux 和 macOS 上ps -ef | grep -i node就够用Windows 上用wmic process where namenode.exe get ProcessId,ParentProcessId,CommandLine能直接看到父子关系。看过几次之后心里就有谱了下次端口冲突时你不会再盲目地全杀 node 进程。1.2 为什么它比想象中更难杀掉开发服务器难杀根本原因是它天生就是个长连接持有者。一个典型的 dev server 会同时占用三类资源一个是监听端口上的 TCP socket一个是文件系统的监听句柄watch 源码目录做热更新还有一个是给浏览器 HMR 用的 WebSocket 长连接。这三样东西里端口是最容易被观察到的但也是最容易骗人的——有时候端口已经释放了进程却还活着因为它在等某些异步任务收尾有时候进程已经退出了端口还处于TIME_WAIT状态lsof依然能查到看起来就像杀不掉。另一层原因是信号的语义差异。CtrlC在终端里触发的是SIGINT这个信号是发给前台进程组的理论上整组都会收到。但如果你用了nohup、、disown、setsid这类手段把进程扔到了后台它就不在前台进程组里了CtrlC对它完全无效。还有更隐蔽的一种某些构建工具在启动时会主动忽略SIGINT或者注册了自己的退出钩子并在钩子里做长时间清理导致你按了之后界面没反应实际上它正在慢吞吞地收尾。我自己就遇到过某次热更新插件在退出时要把缓存写回磁盘整整卡了七八秒才真正断气那几秒里我又按了三次CtrlC结果反而把清理流程打断了留下半个残缺的缓存文件。注意连续狂按CtrlC不是好习惯。第一次按下去之后先等两三秒让进程有机会走完自己的退出逻辑尤其是带文件缓存、数据库连接池、日志落盘的项目粗暴打断有可能留下脏数据。2. 前台关闭的四种手法以及它们的真实差别2.1 CtrlC最正的做法但依赖三个前提在绝大多数情况下CtrlC就是标准答案它干净、可中断、不需要额外命令。但它能生效是有前提的第一你得按在运行着那个进程的那个终端窗口上而不是旁边的标签页第二进程得在前台进程组里第三进程没有主动屏蔽SIGINT。这三个条件缺一个CtrlC就会表现得像失灵。实际操作里最常见的失效场景是你在编辑器内置的终端里跑起来然后鼠标点到了代码编辑区这时候键盘焦点不在终端上CtrlC被编辑器解释成了复制很多编辑器在非选中状态下会把它当作无操作或者复制当前行你按十次也没用。这个坑我见过太多人踩包括我自己在刚换编辑器的时候。判断方法很简单按完看一眼终端里有没有出现^C字符。出现了说明信号发出去了没出现说明键盘事件压根没到终端。还有一种情况是CtrlC发出去了终端也回了提示符但端口还被占着。这通常意味着父进程退出了子进程被过继给了 init 或者系统的进程管理器成了孤儿进程。这时候别怀疑人生直接跳到第 3 节去查端口。如果项目里跑的是 Windows 环境CtrlC的表现会更飘忽一些。原生 CMD 里一般没问题但 Git Bash、某些终端模拟器、以及通过winpty包装过的会话里信号转发经常出岔子。这种情况我建议干脆放弃快捷键直接用后文的taskkill精准处理比反复按键省心。2.2 CtrlZ 的误区暂停不等于停止CtrlZ发的是SIGTSTP它的语义是挂起不是终止。进程被挂起之后内存状态原封不动地保留着端口也照样被它占着只是不再消耗 CPU 了。这时候你去敲npm run dev照样报端口冲突因为那个进程根本没死只是躺平了。很多人的困惑就来自这里明明按了终端也回到提示符了怎么端口还是被占因为你按的是挂起键。要真正结束它挂起之后还得补一刀kill %1针对作业号或者kill -9 PID。顺带提一句jobs命令能列出当前 shell 里所有被挂起的作业bg和fg可以把它扔到后台或拉回前台这套作业控制的机制在处理多个 dev server 同时挂起时挺好用但对新手来说很容易变成我到底把它弄哪去了的混乱。还有个小众但值得知道的Ctrl\发送SIGQUIT默认行为是终止进程并生成 core dump。日常开发基本用不上但如果你在调试一个死循环、连SIGINT都进不去的情况Ctrl\有时候能硬拔出来。代价是可能留下一个几十兆的 core 文件在目录里记得清理。2.3 直接关终端窗口会怎样这是最眼不见心不烦的做法也是最容易留后患的。关掉终端窗口时系统会给该终端下的前台进程组发SIGHUP挂断信号大部分程序收到它会退出。但凡是大部分就意味着有例外注册了SIGHUP处理函数的程序可能选择忽略它被nohup保护过的进程会直接免疫某些情况下进程会抢先把自己重新挂到别的会话里从而躲过这一劫。真正麻烦的是你关窗口的时候并不会收到任何反馈。如果进程恰好没死它就变成了一个彻底不可见的后台进程直到某天你发现端口莫名其妙被占或者 CPU 风扇开始狂转才会想起它。我在早期用 Windows 的时候吃过一次亏某个 dev server 关窗口之后没退干净热更新在后台反复扫目录一晚上把笔记本电池耗光了第二天打开电脑风扇还在响。所以我的建议很明确能用信号停的就别用关窗口的方式停。实在要关窗口关之前先老老实实CtrlC等提示符回来再说。2.4 编辑器内置终端的额外坑现在大部分开发都在编辑器里完成内置终端带来便利的同时也带来了新的关闭难题。第一个坑是前面说的键盘焦点问题。第二个坑是终端进程被编辑器托管某些编辑器在关闭项目文件夹或者窗口时会一次性清理掉所有子终端这个清理是异步的有时候你重新打开项目、马上又跑npm run dev上一个还没来得及退干净的进程正好和新进程撞车。第三个坑更隐蔽编辑器可能开启了终端会话恢复功能你关掉窗口再打开它把之前的终端会话给你还原回来了看起来是一个干净的终端但底层那个 node 进程可能还挂着。这时候你在恢复的终端里看到的提示符是假的实际连接的进程状态和显示的不一致。处理这类问题我的经验是遇到莫名其妙的端口占用先别急着怀疑代码把编辑器完全退出不是关窗口是退出进程再重新打开试一次。如果问题消失基本可以确认是编辑器托管终端留下的残影。长期方案是在项目里配一个predev钩子做端口预检这个后面第 5 节会讲。3. 端口才是判案线索定位并清理残留进程3.1 先确认它是不是真的还在跑报EADDRINUSE的时候第一步不是杀进程而是确认到底是谁占着这个端口。因为有一种情况是幽灵占用进程已经死了但 socket 还在TIME_WAIT或者CLOSE_WAIT状态系统出于安全考虑会保留一段时间通常是 2 倍的最大报文生存时间这期间新进程绑不上同一个端口。这种占用你杀谁都杀不掉只能等或者用SO_REUSEADDR这类套接字选项让新进程复用。区分方法看端口的State字段。Linux 上ss -tulnp | grep 5173如果输出里State是LISTEN说明确实有活着的进程在监听可以下手如果是TIME-WAIT那就在等系统回收硬杀没用。Windows 上netstat -ano | findstr :5173会给出LISTENING、TIME_WAIT之类的状态逻辑一样。我个人的习惯是把这个检查写成一个 alias 或者小脚本一条命令同时输出端口占用状态和对应的进程信息省得每次手动拼命令。这种小工具投入产出比极高一天用十几次的东西花五分钟配置完全值得。3.2 三大系统查 PID 的完整命令真正确认了有活进程在监听之后下一步就是把它揪出来。下面这张表是我这些年反复用的命令集合直接抄就行。系统查端口占用查进程详情终止方式Linuxss -tulnp | grep :5173或lsof -i :5173ps -fp PIDkill PID/kill -9 PIDmacOSlsof -nP -iTCP:5173 -sTCP:LISTENps -fp PIDkill PID/kill -9 PIDWindows CMDnetstat -ano | findstr :5173tasklist /FI PID eq 1234taskkill /PID 1234 /FWindows PowerShellGet-NetTCPConnection -LocalPort 5173Get-Process -Id 1234Stop-Process -Id 1234 -Force这里有几个细节值得单独说。macOS 上的lsof如果不加-sTCP:LISTEN可能会列出浏览器那边的连接让你误以为占端口的是别的东西加上这个过滤干净很多。Windows 的netstat -ano输出里最后一列是 PID但如果你只看端口不看LISTENING状态可能会被一堆ESTABLISHED连接干扰建议配findstr LISTENING一起用。PowerShell 那套命令稍微现代一点Get-NetTCPConnection返回的是对象可以直接管道给Get-Process一行搞定查询和定位。不过要注意端口占用可能是由System进程或者svchost.exe持有的系统保留端口这时候杀不得也杀不掉处理方式是换一个端口而不是跟系统硬碰。提示Windows 上有一类特殊情况某些端口段被系统保留netsh interface ipv4 show excludedportrange protocoltcp可以查落到这些段里的端口无论怎么杀都是占用的只能换端口号。3.3 精准终止与强制终止的选择找到了 PID接下来是选择用哪种方式结束它。这里的原则很直白先礼后兵。kill PID默认发SIGTERM这是让对方体面退出的信号。进程收到之后可以先关连接、落日志、清临时文件走完自己的退出流程再死。绝大多数 dev server 收到SIGTERM都能正常收尾这是首选。kill -9 PID发的是SIGKILL这个信号没法被捕获、没法被忽略进程会被内核直接干掉没有任何机会做清理。除非进程已经僵死、SIGTERM发了几次没反应否则不建议一上来就用-9。强制终止最常见的后果是HMR 的临时缓存文件残留、日志最后几行丢失、某些带锁文件没有被释放导致下次启动报文件被占用。Windows 上taskkill /PID 1234不带/F是温和模式带/F是强制。但 Windows 有个额外的坑只杀父进程的话子进程可能还活着。需要加/T参数把整棵进程树一起带走taskkill /PID 1234 /T /F这个组合在你确认是 npm 那棵树的根节点时非常有效。判断哪个是根节点用前面提到的方法看ParentProcessId就行。我自己总结的一条经验是杀进程之前先确认它是不是你想杀的那个。因为开发机上经常同时开着好几个项目全是 node 进程光看 PID 根本分不清。这时候可以看进程的启动命令里带的工作目录路径那才是唯一可靠的标识。ps -fp PID的输出里如果有cwd信息Linux 上通过ls -l /proc/PID/cwd可以看一眼就能对上号。4. 复杂工程下的关闭难题多进程、容器与远程会话4.1 并行脚本的信号传递陷阱中大型项目里dev脚本往往不是单条命令而是前端 后端 类型检查 mock 服务一起跑。这种并行结构最常用的两个工具是concurrently和npm-run-all它们的工作原理是启动多个子进程然后把输出汇聚到一个终端。问题就出在这里当你按下CtrlC信号先到的是concurrently这个工头工头有没有责任心把信号转发给底下所有工人取决于它的配置。concurrently默认行为是尽量转发但在某些版本和参数组合下会出现主进程退了、某个子进程没收到的情况。解决办法是显式加--kill-others参数作用是只要有一个进程退出或者失败立刻终止其它所有进程。这个参数在 CI 和本地开发里都非常值得加能极大减少僵尸进程。npm-run-all那边如果用的是run-p并行建议加--race参数语义类似第一个结束的进程触发全局退出。不带这个参数的话CtrlC之后可能还剩一两个任务在那跑你还得再找一次 PID。写脚本的时候还有个小技巧值得掌握把清理逻辑挂到进程的退出事件上。Node 里就是process.on(SIGINT, ...)和process.on(SIGTERM, ...)在这两个回调里关数据库连接、关文件监听、清临时文件。这套写法不仅让退出更干净也让后面接手的人少踩坑。不过要注意别在回调里做太重的同步操作否则会像前面说的那样看起来卡死了。4.2 容器里的开发服务器容器环境下停掉 npm run dev完全是另一套逻辑。容器里 PID 1 这个位置很特殊默认情况下内核不会对 PID 1 应用默认的信号处理行为也就是说如果你的ENTRYPOINT直接写的是npm run dev那SIGTERM大概率会被忽略docker stop只能等到超时默认 10 秒后用SIGKILL硬杀。表现出来的现象就是docker stop命令敲下去之后容器状态卡在Stopping十秒钟才变成Exited日志里也看不到任何正常退出的痕迹。这不影响功能但意味着你的进程从来没走过清理流程缓存、日志、临时文件都可能留下脏状态。正规解法是在启动命令前加一个轻量的 init 进程或者用 shell 的exec把信号透传下去。CMD [node, server.js]这种 exec 形式JSON 数组比CMD node server.js这种 shell 形式更好因为 shell 形式会额外套一层/bin/sh -c信号要先经过 shell 才能到 node中间那层 shell 经常不转发。这个细节在排查容器停不下来时几乎是第一嫌疑。排查容器问题时我一般会分两步走先docker exec进去用ps -ef看进程树的结构确认 PID 1 到底是谁再看docker stop之后日志里有没有收到信号的回显。如果 PID 1 是 shell 而不是你的应用那基本就确诊了。4.3 远程会话断开后的孤儿进程在远程开发机上跑 dev server 是常态但会话断开的处理很容易被忽略。如果是普通的交互式登录会话断开时进程会收到SIGHUP多数会退出可一旦你之前用了后台运行或者某些守护方式进程就会活下来继续占着端口下一次登录时你就懵了——明明刚连上来端口怎么就被占了。处理这类残留最直接的办法还是回到端口查询那套流程找到 PID 之后正常终止。如果担心以后还会出现可以在启动时用setsid之类的手段把进程放进独立会话然后在下次登录时通过记录下来的 PID 文件去管理它。这里的关键是记录 PID启动脚本里把echo $! .dev.pid写进文件停止脚本里kill $(cat .dev.pid)就够了。这种原始但可靠的方式比各种花哨的进程管理方案更适合本地开发场景。顺带说一个容易被忽视的点远程机器上的时钟和本地可能不同步某些工具会依据文件修改时间判断是否需要重建时钟漂移会导致热更新行为异常。这跟停不掉没有直接关系但会让明明停掉了重启还是旧代码这种诡异现象出现排查时值得一并检查。5. 从源头治理让进程自己会体面退出5.1 在脚本里写清清理逻辑与其每次出问题再去找 PID不如让启动流程自带一层保护。最实用的做法是在package.json里挂一个predev钩子npm 会在执行dev之前自动跑它。这个钩子里做的事情就一件检查目标端口是否被占用如果被占就先清理清理不掉就明确报错并给出 PID让开发者自己决定。这个方案的价值在于把隐性问题变成显性问题。原来你只看到一个EADDRINUSE不知道是谁占的现在终端直接告诉你端口 5173 被 PID 8942 占用它来自某个目录是否要终止。团队里新人多的时候这一条能省下大量重复沟通。写这个钩子的时候有两个注意事项。一是跨平台兼容不同系统查端口的命令完全不一样得做分支判断或者干脆引入一个跨平台的小工具包别自己手写三套逻辑。二是不要默认强杀因为那个被占用的端口很可能是同事自己刻意开着的一个服务自动杀掉会引发新的困惑。做成提示 可选清理更稳妥。5.2 参数与工具层面的兜底除了自己写钩子还有一批现成的配置能减少麻烦。构建工具层面大部分 dev server 都支持端口被占用时自动递增的选项开了之后就不会因为端口冲突起不来代价是你得注意实际用的是哪个端口终端里一般会打印出来。这个选项适合本地开发不适合需要固定端口的调试场景。进程管理层面如果项目需要长期跑一个开发服务可以考虑用带进程管理能力的工具它们通常都提供了stop、restart、logs这些命令比手动找 PID 优雅得多。不过对于日常的npm run dev我不太建议引入这么重的东西杀鸡用牛刀反而增加了理解成本。还有一条容易忽略的保持 npm 版本相对统一。不同版本的 npm 在信号转发上的行为是有差异的团队里有人用很老的版本、有人用最新版就会出现我这边CtrlC好使你那边不好使的玄学。在项目里加一个engines字段声明版本范围配合版本管理工具锁一下能规避掉相当一部分这类问题。5.3 给团队定几条约定技术手段解决不了的靠约定。我在带项目的时候会推行这么几条效果不错。第一条dev server 只在专用终端里跑。不要在一个终端里先跑 dev、再CtrlZ挂起、再跑测试、再fg拉回来。这种操作灵活是灵活但对旁观者极不友好出了问题谁都理不清状态。第二条端口号尽量避开默认值。多个项目同时开发时默认端口撞车的概率高得离谱。给每个项目分配一个固定区间比如 A 项目 51xxB 项目 52xx从源头上减少一半冲突。第三条遇到端口占用第一反应是查而不是杀。养成先看清楚是谁占着的习惯比一上来就kill -9安全得多。开发机上经常有别人远程连过来的会话乱杀容易误伤。这几条听起来琐碎但真的执行下去之后团队里我这里跑不起来的消息会少一大截。6. 踩坑实录与速查表6.1 常见症状对照排查表把前面这些内容浓缩成一张表遇到问题时按症状直接对号入座比从头读一遍快得多。症状表现最可能的原因处理动作按CtrlC终端无任何反应连^C都不出现键盘焦点不在终端或被编辑器拦截点击终端区域再按或改用编辑器的停止按钮按CtrlC出现^C但提示符不返回进程屏蔽了SIGINT或正在长时间清理等 3-5 秒仍无反应则另开终端查 PID终端已回提示符但重新启动仍报端口占用子进程成孤儿仍在监听用端口查询定位 PID 后终止端口查询显示TIME_WAIT找不到对应进程socket 处于等待回收状态等 1-2 分钟或换端口查到的进程是System/svchost端口落在系统保留段换端口不要尝试终止docker stop卡十秒才退出PID 1 未正确处理SIGTERM改用 exec 形式启动或加 init 进程并行脚本停掉后仍有个别任务在跑缺少--kill-others/--race参数补上参数或手动定位残留进程编辑器重启后端口仍被占终端会话恢复留下的残影完全退出编辑器进程再试6.2 几条用真金白银换来的经验最后分享几个我印象比较深的教训都是常规文档里不会写的。第一个是关于杀掉之后立刻重启的。有些 dev server 在退出时会把自己的缓存写回磁盘如果你在它还没写完的时候就把新进程拉起来新进程读到的是半个文件表现出来的症状是启动成功了但页面白屏或者热更新完全失效。这种问题极难定位因为报错信息指向的地方跟真正的原因八竿子打不着。我的做法是杀掉之后先sleep 1再启动花一秒买个安心。第二个是关于批量杀进程的。网上很多教程会教你pkill -f node或者killall node一条命令清空所有 node 进程。这在个人机器上偶尔为之还行在多项目并行或者机器上跑着别人的服务时就是灾难。我见过一次某同学为了清一个 dev server把所有 node 进程全杀了结果连带干掉了另一个同事正在跑的调试会话两个人花了一下午才对齐状态。真正靠谱的做法永远是先定位再精准处理。第三个是关于 Windows 路径的。Windows 上某些情况下netstat输出的 PID 和你用任务管理器看到的对不上原因是netstat显示的是监听端口的那个进程 ID而任务管理器默认按应用分组显示。要精确对上号用tasklist /FI PID eq 编号去查比在任务管理器里翻找靠谱。第四个是心态层面的。这类问题刚入行时容易急躁觉得不就是关个服务吗怎么这么麻烦然后开始乱试命令。实际上端口、信号、进程树这套东西是整个操作系统层面最基础也最容易出偏差的部分认真搞懂一次后面遇到的所有类似问题——包括数据库连接不上、服务重启残留——排查思路都是通用的。我自己就是从反复被EADDRINUSE折磨开始才慢慢建立起对进程模型的直觉这个投入回报比相当高。如果非要留一句总结性的话那就是下次再遇到npm run dev关不掉别急着删node_modules。先看一眼端口是谁占的再决定是礼送出境还是强制清场这顺序一换很多玄学问题立刻就变成可解释问题了。
企业数字化 ERP 产品动态
相关推荐
读懂ISO 15118-20:电动汽车充电通信协议与即插即充实践 简介:面向电动汽车充电、智能电网研发、测试及标准化人员的 ISO 15118-20:2022 英文标准原文,聚焦道路车辆与电网通信接口第二代的网络层与应用层要求,可用于协议设计、互操作性验证及充电通信系统开发对照。压缩包内共 1 个 PDF 文件&#x… · 2026/11/3 21:16:29
HBM与单体3D DRAM技术本质区别解析 简介:本资源为Yole Intelligence发布的《Next-Generation DRAM 2024:Focus on HBM and 3D DRAM》深度技术报告,面向半导体工程师、存储器研发人员、AI硬件架构师及高校微电子方向研究者,系统解答高带宽内存与三维集成DRAM的技术路… · 2026/11/3 21:16:29
PostgreSQL慢查询三层跟踪体系:从宏观到微观的精准诊断 1. 这不是“查慢SQL”,而是给数据库装上实时心电监护仪你有没有遇到过这样的场景:业务系统突然卡顿,用户投诉电话一个接一个打进来,监控大盘上CPU和IO曲线像坐过山车一样飙升,而DBA同事盯着pg_stat_statements视图里那… · 2026/11/3 21:16:29
DeepWiki:AI驱动的GitHub项目知识图谱生成工具 1. 项目背景与核心价值最近在技术社区发现一个名为DeepWiki的神奇工具,它能够自动解析GitHub项目并生成结构化知识图谱。作为一名长期在开源生态中摸爬滚打的开发者,我立刻意识到这可能是解决"项目理解成本高"痛点的利器。传统方式下ÿ… · 2026/11/4 4:06:34
C++深度学习部署实战:从VSCode调试到Visual C++运行时避坑指南 1. 这不是“C 深度学习”的第十二讲,而是被严重误读的工程现实很多人看到“C 深度学习(十二)”这个标题,第一反应是:又一本讲如何用 C 从零手写神经网络的教程?或者,是不是某套付费课程的第十二… · 2026/11/4 4:06:34
投机采样加速大模型推理:原理、EAGLE与草稿树实战调优 1. 为什么投机采样值得单独拿出来讲大模型推理优化这个话题,能聊的东西太多了。量化、KV Cache 管理、算子融合、连续批处理、PagedAttention,每一个方向都能写一整篇。但投机采样(Speculative Sampling)是个特别的存在——它不改… · 2026/11/4 4:06:34
智谱API积分计费原理与成本优化实战指南 1. 先说结论:别被“Lite/Pro/Max”字面迷惑,积分不是按档位固定发放的最近不少朋友在后台问:“智谱新套餐的积分到底怎么算?我选了Pro,是不是每月自动到账XX分?”——这个问题背后藏着一个普遍误解… · 2026/11/4 4:06:34
Java大数据可视化在水资源管理中的实践与优化 1. 项目概述:Java大数据可视化在水资源管理中的价值去年夏天,我在中部某省会城市(以下简称C市)调研时,亲眼目睹了老城区供水管网锈蚀渗水的场景。运维组长老王告诉我:"这片区每天至少漏10吨水… · 2026/11/4 4:06:34
机载AI部署实战:YOLOv8在无人机上的四层漏斗优化 1. 这不是“把模型拷过去就完事”的活儿——机载AI部署的真实门槛在哪?你搜“YOLOv8 部署到无人机”,首页跳出来的教程,十有八九是:装好Python、pip install ultralytics、跑通detect.py、再把weights/best.pt复制进树莓派——然后… · 2026/11/4 4:05:34
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46