1. 为什么合盖不休眠是个真需求而不是瞎折腾先把场景说清楚。MacBook 默认的逻辑是合上盖子就进入睡眠屏幕熄灭、大部分进程挂起、网络活动降到最低。这个设计对绝大多数人是合理的——省电、降温、保护电池。但有一类场景它就是不合适你合着盖子但机器还得继续干活。我自己最常遇到的是三种情况。第一种是跑长任务编译一个大型项目、渲染一段视频、跑一个数据清洗脚本这些动辄半小时起步我不想开着屏幕耗电但任务不能断。第二种是当临时服务器用局域网里其他设备要访问这台 MacBook 上的服务比如本地部署的数据库、文件共享、开发调试用的 Web 服务合盖就断连非常烦。第三种是外接显示器当主机用笔记本合盖立在支架上接一个大屏这时候它本质上就是台台式机凭什么合盖就睡。这里有个很多人不知道的点MacBook 合盖后能不能继续工作取决于它有没有外接电源和外接显示器。苹果官方的合盖模式Clamshell Mode要求同时满足接电源、接外显、接键鼠这几个条件缺一个就老老实实睡眠。而我们要做的是在不满足这些条件的情况下也能让它合盖不睡——这就得动系统层面的设置了。关键词里的pmset是整件事的核心工具它是 macOS 自带的电源管理命令行工具全称 Power Management Settings。内核扩展这个词则涉及一些更底层的方案后面会讲到为什么现在基本不推荐走这条路。至于终端命令是因为图形界面里根本没有合盖不休眠这个开关苹果故意没做只能靠命令行。提醒一句让笔记本合盖持续运行散热是个绕不开的问题。合盖状态下键盘面散热通道被挡住长时间高负载会让机器温度明显偏高。这不是危言耸听后面会专门讲怎么缓解。下面我按从简单到复杂、从推荐到不推荐的顺序给你三个方案。每个方案我都会说清楚它到底改了什么、适合谁、有什么坑。2. 方案一pmset 直接改电源策略最正统也最可控2.1 pmset 到底在管什么在动手之前你得先明白pmset管的是什么。macOS 的电源管理分两个维度接电源时AC和用电池时Battery这两套策略是分开的。你插着电改的东西拔了电不一定生效反过来也一样。这一点非常关键很多人改完发现没用就是因为改错了维度。先看当前状态打开终端输入pmset -g你会看到一堆输出重点看这几行SleepDisabled 0 displaysleep 10 sleep 1 hibernatemode 3sleep是系统睡眠计时器单位是分钟。sleep 1表示空闲 1 分钟后睡眠。displaysleep是显示器关闭计时器。SleepDisabled是是否禁用睡眠的总开关这个值如果是 1那系统就完全不睡了。hibernatemode是休眠模式涉及内存写不写硬盘后面细说。pmset -g默认显示的是当前生效的那套通常是 AC。想看电池那套用pmset -g custom它会同时列出 Battery 和 AC 两组。2.2 让合盖不睡的核心命令真正让合盖不休眠生效的是SleepDisabled这个开关。设置命令是sudo pmset -a disablesleep 1拆解一下-a表示对所有电源模式生效AC 和 Battery 都改disablesleep 1就是打开禁用睡眠。执行完你再pmset -g看一眼SleepDisabled应该变成 1 了。这时候你合盖试试机器不会睡屏幕会灭但进程继续跑。想恢复默认把 1 改成 0sudo pmset -a disablesleep 0如果你只想在插电时禁用睡眠、用电池时保持正常这是我更推荐的策略省得忘了拔电把电池耗干那就分开设sudo pmset -c disablesleep 1 sudo pmset -b disablesleep 0-c是 charger接电源-b是 battery用电池。这样插着电合盖不睡拔了电合盖照常睡逻辑上最稳妥。2.3 为什么我优先推荐这个方案对比后面两个方案pmset的优势非常明显。它是系统原生工具不装任何第三方软件不碰内核不改系统文件风险最低。而且它是可逆的一条命令就能恢复不会留下什么残留。再一个它粒度细能精确控制 AC 和 Battery 两套策略这是图形界面工具做不到的。但有几个坑必须提前说。第一个坑disablesleep是全局的它不管你是不是合盖。也就是说你设了disablesleep 1之后就算你开着盖子、人离开了机器也永远不睡。这意味着如果你忘了关它会一直亮着或者一直跑着直到电量耗尽或者你手动处理。所以我的习惯是只在需要的时候开用完立刻关。可以写两个 alias 放在~/.zshrc里alias nosleepsudo pmset -a disablesleep 1 echo 已禁用睡眠 alias yesleepsudo pmset -a disablesleep 0 echo 已恢复睡眠这样敲nosleep和yesleep就行不用每次记命令。第二个坑系统更新后可能被重置。macOS 大版本升级比如从 Monterey 升到 Ventura之后电源策略有时会被重置回默认。升级完记得pmset -g复查一下。第三个坑disablesleep和sleep 0不是一回事。有人图省事直接sudo pmset -a sleep 0把睡眠计时器设成 0。这个做法在旧版本上能用但新版本 macOS 对sleep 0的处理有变化而且它和disablesleep的语义不同——sleep 0是永不因空闲而睡但合盖这个动作是硬件触发的sleep 0不一定拦得住。所以认准disablesleep别用sleep 0凑合。2.4 配合 hibernatemode 的进阶调整如果你追求更彻底的控制可以顺带看看hibernatemode。这个参数决定睡眠时内存内容怎么处理hibernatemode行为适用场景0只睡眠内存供电不写硬盘台式机追求快速唤醒3睡眠为主同时把内存写一份到硬盘笔记本默认兼顾速度和安全25只休眠内存写硬盘后断电追求极致省电对于合盖不休眠这个需求hibernatemode其实不是重点因为你压根不让它睡。但如果你用的是合盖后过一段时间再休眠这种折中策略那hibernatemode 25会更省电。改法sudo pmset -a hibernatemode 25不过说实话日常用默认的 3 就够了没必要折腾。我提这个只是让你知道有这么个东西遇到相关问题时心里有数。3. 方案二caffeinate 临时顶一阵适合就这一次的场景3.1 caffeinate 是什么和 pmset 什么关系caffeinate是 macOS 自带的另一个命令行工具名字很形象——给机器喂咖啡让它保持清醒。它和pmset的区别在于pmset改的是持久化的系统策略caffeinate是临时性的、进程级的。什么意思你运行caffeinate命令它会启动一个进程只要这个进程活着系统就不会睡。你按CtrlC结束它或者它自己超时退出系统就恢复正常的睡眠逻辑。它不改任何系统设置所以更安全、更无痕。这决定了它的适用场景你只是临时需要机器醒着一会儿不想动系统全局设置。比如你要下载一个大文件预计 20 分钟下完就没事了那用caffeinate最合适。3.2 常用参数和实战组合caffeinate的参数设计得挺讲究每个字母对应一种阻止caffeinate -d # 阻止显示器睡眠 caffeinate -i # 阻止系统因空闲而睡眠 caffeinate -m # 阻止硬盘睡眠 caffeinate -s # 阻止系统睡眠接电源时 caffeinate -u # 模拟用户活动最常用的组合是-i和-d一起上caffeinate -di但注意caffeinate默认是一直运行到你手动停止。如果你想要它跑一段时间自动结束用-t指定秒数caffeinate -di -t 3600这就是让它保持清醒 1 小时到点自动退出。更实用的玩法是绑定到某个命令上。caffeinate可以直接包裹另一个命令那个命令跑完caffeinate就退出caffeinate -i make build这样在make build编译期间系统不会睡编译一结束就恢复正常。这个用法我强烈推荐比手动开开关关省心多了。3.3 caffeinate 能不能管合盖这是关键问题也是很多人踩坑的地方。caffeinate默认管不住合盖睡眠。因为合盖是硬件事件优先级比caffeinate的阻止空闲睡眠要高。你合上盖子系统该睡还是睡。那怎么办答案是配合pmset的disablesleep一起用或者用-s参数在某些版本上能拦住。但实测下来最可靠的做法还是方案一的disablesleep。caffeinate更适合开着盖子但不想让它空闲睡眠的场景。所以我的建议是把caffeinate当成防空闲睡眠的工具把pmset disablesleep当成防合盖睡眠的工具两者定位不同别混用。如果你既要合盖不睡、又要临时控制时长那就pmset开全局用完再关caffeinate在这里帮不上大忙。有个例外如果你外接了显示器和电源进入了官方的 Clamshell Mode那caffeinate是能起作用的因为这时候合盖本来就不睡caffeinate只是防止它因为空闲而睡。但这就回到官方支持的范畴了不算破解。4. 方案三内核扩展与第三方工具为什么我劝你别碰4.1 内核扩展这条路的历史与现状早些年macOS 10.15 Catalina 之前确实有一些第三方工具通过内核扩展Kernel Extension简称 kext来实现合盖不休眠。原理是在内核层面拦截电源管理事件强行阻止睡眠流程。这类工具在当时确实有效但代价很大。内核扩展运行在系统最底层权限最高一旦出问题就是内核崩溃Kernel Panic直接整机重启严重时甚至进不了系统。而且苹果这些年一直在收紧内核扩展的口子Catalina 开始要求用户手动在安全性与隐私里批准Big Sur 之后引入了System Extension新框架传统的 kext 越来越难加载。到了 Apple Silicon 时代加载第三方内核扩展基本被堵死了。所以现在你如果搜到某篇老教程让你装个 kext 来实现合盖不睡直接跳过。那套东西在新系统上要么装不上要么装上了不稳定得不偿失。4.2 第三方 GUI 工具的真实价值那现在市面上那些图形界面的防睡眠工具还有没有用有用但要看它底层调的是什么。靠谱的工具本质上就是在帮你调pmset只是包了个好看的界面加了个菜单栏图标方便点。这类工具的价值在于方便不在于能力——它能做的你用命令行都能做。判断一个工具靠不靠谱看两点一是它要不要你关 SIP系统完整性保护二是它要不要装内核扩展。如果两个都要直接放弃。如果它只是调用pmset或者caffeinate那可以用但你要清楚它没给你带来任何命令行之外的能力。我个人的态度是这类需求用命令行就够了没必要为它装一个常驻后台的 App。菜单栏多一个图标、后台多一个进程都是负担。而且第三方工具在系统大版本更新后经常失效你还得等作者适配不如自己掌握命令来得踏实。4.3 关于 SIP 和任何来源的提醒热词里出现了macos 怎么关闭 sip和macos 任何来源这俩经常和装第三方工具绑在一起出现。这里必须说清楚关闭 SIP 是一个高风险操作。SIP 是 macOS 的核心安全机制它保护系统文件和关键进程不被篡改。关掉它等于把系统的大门敞开恶意软件、误操作都能长驱直入。为了一个合盖不休眠的功能去关 SIP性价比极低。方案一的pmset完全不需要关 SIP一条命令搞定。所以我的立场很明确能用原生命令解决的绝不关 SIP、绝不装内核扩展。至于任何来源那是 Gatekeeper 的设置允许运行非 App Store、非认证开发者的应用。这个在需要装某些工具时会用到但同样能不用就不用。你从不明来源下载的工具风险自己承担。5. 三个方案怎么选一张表说清楚把三个方案摆在一起对比选择就清晰了维度pmset disablesleepcaffeinate内核扩展/第三方工具能否管合盖能默认不能能但风险高是否改系统设置是持久化否临时是且改底层风险等级低极低高可逆性一条命令恢复进程结束即恢复卸载麻烦可能残留适用场景长时间合盖运行临时防空闲睡眠不推荐需要关 SIP否否通常需要系统更新后可能重置需复查无影响大概率失效我的推荐顺序很明确首选pmset临时需求用caffeinate内核扩展那条路直接放弃。这三个方案不是并列关系而是有明确优劣的。再补充一个组合用法日常用pmset设好 AC 不睡、Battery 正常睡然后跑长任务时用caffeinate -i包住命令。这样既保证了合盖不睡又保证了任务期间不会因为其他原因空闲睡眠双保险。6. 合盖持续运行必须注意的散热与电池问题6.1 合盖运行的散热真相这是我最想强调的部分因为太多人只关心怎么让它不睡却忽略了不睡之后机器扛不扛得住。MacBook 的散热设计是通过键盘面和底壳共同散热的。合上盖子之后键盘面被屏幕挡住散热面积直接少了一大块。如果你还在跑高负载任务编译、渲染、跑模型热量堆积会非常明显。我实测过同样一个编译任务开盖跑 CPU 温度在 75 度左右合盖跑能到 90 度以上风扇转速拉满。短期偶尔为之问题不大但长期合盖高负载运行对电池和主板都不友好。锂电池怕热长期高温会加速老化容量衰减更快。缓解办法有几个垫高机身让底壳悬空增加底部空气流通。一个几十块的铝合金支架就能明显改善。避免在软表面床、沙发上合盖运行那等于把散热孔全堵死。控制任务强度如果只是跑个下载、挂个服务负载低合盖问题不大如果是重负载尽量开盖或者外接散热。监控温度可以用sudo powermetrics --samplers smc看实时温度或者装个菜单栏温度监控工具。6.2 电池策略别让不睡变成耗干disablesleep 1最大的隐患是你忘了关。合盖放进包里以为它睡了结果它一直在跑几个小时后再拿出来电量见底甚至因为过热触发保护。我的做法是只在 AC 模式下开disablesleepBattery 模式保持正常睡眠。这样即使忘了关拔了电它也会睡不会把电池耗干。前面给的-c和-b分开设的命令就是为了这个。另外如果你经常需要合盖跑任务可以考虑接一个外接电源常驻让机器始终处于 AC 模式这样策略稳定也不用担心电量。6.3 一个容易被忽略的点网络活动合盖不睡之后机器的网络是活的。如果你在跑下载、同步、远程访问这些都会持续消耗资源。特别是远程访问类服务如果暴露在公网上安全风险不小。我的建议是合盖运行的服务尽量只监听局域网别图方便开到公网。本地开发调试用的服务绑定127.0.0.1或者局域网 IP 就够了。7. 常见问题排查改完没生效怎么办7.1 先确认你改对了维度最常见的没生效其实是改错了电源维度。你用pmset -b改的电池策略结果测试时插着电那当然不生效。排查第一步pmset -g custom把 Battery 和 AC 两组都看一遍确认SleepDisabled在你当前使用的模式下是 1。7.2 确认没有其他因素干扰有时候disablesleep是 1但机器还是睡了可能是这些原因电量过低触发强制睡眠。macOS 在电量极低时会强制睡眠保护电池这个优先级最高disablesleep拦不住。热保护。温度过高时系统会强制降频甚至睡眠这是硬件保护改不了。某些外接设备或驱动。个别扩展坞、外设的驱动会干扰电源管理拔掉试试。系统更新重置。前面提过大版本更新后复查。7.3 恢复默认的完整步骤如果你折腾完想彻底恢复原状按这个顺序来sudo pmset -a disablesleep 0 sudo pmset -a sleep 1 sudo pmset -a hibernatemode 3然后pmset -g确认SleepDisabled是 0。这样系统就回到出厂默认的电源策略了。如果你之前装过第三方工具记得也卸载干净别留后台进程。8. 我自己的日常配置与几点体会说说我现在的实际配置。我常年把 MacBook 当半台台式机用接一个外显但经常需要合盖跑东西。我的设置是sudo pmset -c disablesleep 1 sudo pmset -b disablesleep 0插电时合盖不睡拔电时正常睡。然后~/.zshrc里放了nosleep和yesleep两个 alias需要临时全局禁用时手动开。跑长任务时我会用caffeinate -i包住命令双保险。踩过的坑里最深刻的一次是忘了关disablesleep合盖塞包里跑了一下午拿出来烫手电量从 80% 掉到 15%。从那以后我就坚持 AC/Battery 分开设再也没出过这个问题。还有一次是系统升级后策略被重置我以为是命令失效了折腾半天才发现是升级覆盖了设置。现在养成了升级后先pmset -g看一眼的习惯。最后分享一个小技巧如果你只是想临时让某台机器在合盖状态下跑完一个任务可以用caffeinate包命令 pmset临时开任务结束自动关。写成一个脚本#!/bin/bash sudo pmset -a disablesleep 1 caffeinate -i $ sudo pmset -a disablesleep 0保存成run-nosleep.sh用的时候./run-nosleep.sh make build任务跑完自动恢复睡眠省心又安全。这个脚本我用了大半年没出过岔子。