ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Mac锁屏后屏幕不灭?从电源管理到pmset排查修复指南

Mac锁屏后屏幕不灭?从电源管理到pmset排查修复指南

敢拿“mac锁屏后未熄屏”当关键词来搜的人,多半已经试过把屏幕保护程序、锁定屏幕、自动睡眠这些选项都点了一遍,结果锁屏后屏幕还是照常亮着。这个现象其实不玄,问题关键往往不在“锁定”上,而在于另一套完全独立的计时机制——显示器睡眠时间。今天这篇就从原理、排查、修复到外接显示器的特殊场景,一次性把这个问题拆干净。内容适合刚接触 Mac 的小白,也适合被外接显示器折腾很久的开发者参考。

1. 先分清三件事:锁定、睡眠和显示器熄灭

1.1 锁屏不等于休眠

很多人习惯把“锁屏”和“休眠”混在一起,实际上在 macOS 里,它们是完全不同的路径。锁屏只是把当前用户会话锁住,回到 loginwindow 界面,系统本身还在正常运行,CPU、内存、网络请求都还在跑。你可以按下Control + Command + Q立刻锁屏,但这时候的 Mac 只是“被锁了”,并不是“要睡了”。

如果系统还处于活跃状态,显示器自然就没有义务熄灭。换句话说,锁屏后屏幕继续亮着,在 macOS 的逻辑里完全可能是一个正常状态,只是用户预期和系统设计没有对齐。

1.2 显示器睡眠和系统睡眠是两套独立计时器

macOS 的电源管理里,有三套不同的时间参数:

  • displaysleep:控制显示器多久无操作后进入睡眠,也就是你理解的“熄屏”
  • sleep:控制系统多久无操作后整体休眠
  • disksleep:控制硬盘多久无操作后停转

它们之间有关联,但不是简单的包含关系。正常情况下,系统睡眠会先让显示器进入睡眠,但显示器睡眠并不一定会触发系统睡眠。尤其当某个进程持有“阻止系统睡眠”或“阻止显示器睡眠”的断言时,锁屏后屏幕就会一直亮着。

在系统设置的“锁定屏幕”或者“节能”里,你看到的“在不活跃时关闭显示器”“开始屏幕保护程序”等选项,改的是计时器;而“阻止自动睡眠”等选项,改的又是另一组行为。很多人把所有选项都改了,但不知道哪个生效,就会出现“明明设置了 5 分钟熄屏,锁屏后却一整夜都亮着”的怪象。

1.3 什么情况下“锁屏后还亮着”反而正常?

如果你的 Mac 正在执行下载、播放媒体、做屏幕录制,或者连接了外接显示器并且处于合盖使用状态,那么系统为了保住任务,往往会主动忽略显示器的休眠计时。这不算故障,而是 macOS 的设计取舍。

还有一类常见情况:你人在屏幕前,刚锁屏不到几分钟,屏幕没熄灭是正常的,因为displaysleep的计时还没走完。只有等了很久屏幕依然不灭,才真正需要下面这些排查步骤。

2. 排查清单:为什么锁屏后屏幕还亮着

2.1 先看“显示器关闭时间”是否被设成了“永不”

这是最常见的原因,没有之一。在 macOS 新版系统中,路径通常是“系统设置 → 锁定屏幕”,里面有一项“在不活跃时关闭显示器”。如果你的设置是“永不”,那么无论你怎么锁屏,只要系统没休眠,屏幕就会一直亮。

老版本 macOS 里,这个选项在“系统偏好设置 → 节能”里,表现为一个滑杆或下拉菜单。很多用户是为了看视频或者远程连接特意改成“永不”,后来忘了改回来,结果锁屏后屏幕死活不灭。

2.2 第三方防睡眠工具或 caffeinate 进程还在生效

如果你装过类似“防睡眠”“保持唤醒”的辅助工具,或者看过视频时用过命令行保持屏幕常亮,那么三十分钟后即使锁屏,那个进程依然可能持有防熄屏断言。

命令行里有个经典工具叫caffeinate,作用是让系统在指定时间内不睡眠,其中-d参数专门阻止显示器睡眠。如果在终端执行过类似caffeinate -d -t 3600,那接下来一小时,锁屏也不会熄屏。

最隐蔽的是后台进程主动调用防睡眠接口。比如某个播放器软件在播放途中被锁屏了,播放器虽然没窗口,但仍持有“防止显示器睡眠”的断言,Mac 就会继续亮屏。

2.3 外接显示器、扩展坞和供电方式给你添乱

外接显示器的睡眠逻辑和内置屏幕不完全一样。Mac 通过 DP、HDMI 或雷雳接口把图像信号送到外接屏,如果显示器没有收到标准的省电指令,或者扩展坞没有正确转发 DPMS 电源管理信号,屏幕就会保持点亮,甚至显示“无信号”也不熄屏。

合盖使用也很关键。如果你把 MacBook 合上盖子,外接显示器继续工作,系统认为你在使用“合盖桌面模式”,这时候锁屏只锁系统,显示器仍会收到信号,屏幕自然不灭。这类场景需要单独调整外接显示器的省电设置。

2.4 系统设置里的“阻止自动睡眠”选项被勾选

在“系统设置 → 电池”或“电源适配器”里,有一项“当显示器关闭时,防止 Mac 自动进入睡眠”。这个选项的作用,是让 Mac 在显示器熄灭后仍然保持系统清醒,方便你远程访问或者继续下载。

如果你锁屏后屏幕不灭,可以看看是不是这个选项的配套逻辑被打开了,或者是某个“省电模式”反向触发了长期亮屏。尤其在新系统里,这一项经常因为误操作而开启。

2.5 配置描述文件或终端 pmset 参数覆盖了界面设置

如果你在终端里手动敲过pmset命令,或者所在环境下发过电源策略描述文件,那么系统设置里看到的界面值可能只是“显示值”,真实生效值可能被覆盖。pmset 里的displaysleep 0就表示“显示器永不睡眠”,这个值一旦存在,你在设置里改成 10 分钟也未必管用,因为某些配置文件会把它改回来。

我把常见原因和快速验证方式整理成了下面这张表,排查时可以按着顺序来。

现象优先怀疑快速验证方式
锁屏后一直亮,几分钟都等不到熄灭显示器睡眠时间被设成永不pmset -g custom看displaysleep是否为 0
锁屏前有看视频/录音/远程操作的场景后台进程持有防睡眠断言pmset -g assertions找PreventUserIdleDisplaySleep
终端跑过 caffeinate 或类似命令caffeinate 进程未退出ps aux | grep caffeinate
外接显示器或扩展坞连接中外部显示信号未进入省电状态拔掉外部显示器测试,观察内置屏是否熄屏
重启后偶尔正常,过一段时间又复发第三方工具随登录项重新启动检查“系统设置 → 通用 → 登录项”
系统设置改过但不生效pmset 或描述文件覆盖在终端执行sudo pmset -a displaysleep 1后重新锁屏测试

3. 用终端把原因挖出来:pmset、活动监视器和日志实战

3.1 当前电源策略到底是怎么写的

想要知道锁屏后会不会熄屏,最直接的办法是看一眼系统真正生效的电源策略。打开终端,执行:

pmset -g custom

这条命令会同时打印出电池供电和电源适配器供电两套策略。以 MacBook 为例,你可能会看到类似这样的输出:

Battery Power: lidwake 1 autopoweroff 1 autopoweroffdelay 14400 disksleep 10 displaysleep 2 sleep 10 ... AC Power: displaysleep 0 sleep 10 ...

注意看displaysleep的值。0表示永不睡眠,1表示 1 分钟,2表示 2 分钟,以此类推。如果 AC Power 下面的displaysleep是 0,那么插着电源锁屏,屏幕就很容易一直亮。

也可以直接用pmset -g查看当前生效环境下的值,但-g custom能同时看到两套策略,排查时更方便。

3.2 看看到底是谁在阻止熄屏

电源管理断言(assertion)是 macOS 用来协调任务和电源状态的关键机制。你可以通过下面的命令查看系统里有哪些进程正在阻止显示器或系统睡眠:

pmset -g assertions

输出内容比较多,可以加上过滤条件:

pmset -g assertions | grep -B 3 -A 6 "PreventUserIdleDisplaySleep"

如果看到某一行写着:

Created for PID: 1234 (后台进程名)

说明这个进程在阻止“用户空闲时的显示器睡眠”。锁屏后屏幕不灭,大概率就是这类断言没有释放。PreventUserIdleSystemSleep则是阻止系统整体休眠的断言,它也会间接导致屏幕持续输出。

这里有个容易忽略的细节:防睡眠断言不一定是用户主动开启的。系统服务、媒体播放器、远程管理工具、备份软件、浏览器里的 WebRTC 通话等,都可能悄无声息地持有断言。

3.3 活动监视器是图形化的断言入口

如果你不想记命令行,活动监视器也能看到相关信息。打开“活动监视器”,切到“能耗”标签页,把列显示设置里把“阻止睡眠”这一列打开,就能看到每个进程是否在阻止系统睡眠。

这个界面比终端更直观,适合快速发现是谁在锁屏后“拖住”系统。杀掉对应进程或退出应用后,再锁屏测试,通常问题立刻缓解。

3.4 检查 caffeinate 进程和残留任务

如果你或者某个脚本启动过 caffeinate,可以用这条命令查找:

ps aux | grep caffeinate | grep -v grep

有结果的话,直接终止:

killall caffeinate

如果 caffeinate 是以 root 身份启动的,可能需要加sudo killall caffeinate。之后重新锁屏,观察屏幕是否按预期熄灭。

我遇到过一台机器,问题根源就是定时任务脚本在每天下午启动了一个caffeinate -d -t 86400,等于给系统下达了“一整天屏幕都不许睡”的指令。查了电源设置和断言都正常,最后靠ps aux找到了残留进程。

3.5 用滚动日志抓熄屏时间线

如果上面这些都正常,但屏幕还是不灭,可以尝试查看系统日志里显示器睡眠相关的事件。下面这条命令会抓取最近 10 分钟与 display sleep 有关的日志:

log show --last 10m --predicate 'eventMessage CONTAINS[c] "display" AND eventMessage CONTAINS[c] "sleep"' --style compact

日志量可能会很大,建议先手动锁屏,等一分钟再执行,观察有没有出现过“开始显示器睡眠”的事件。如果没有对应事件,说明系统压根没有尝试关闭显示器;如果事件发生了但屏幕还亮,那就更偏向外部硬件或显示器本身的问题。

日志排查不适合作为第一站,但在内置屏幕、外接屏混合的场景下,它能帮你区分“系统没发指令”和“显示器不响应指令”。

4. 修复实操:一步步让锁屏后正常熄屏

4.1 先从系统设置下手,把基础值改对

在 macOS 新版系统里,路径是“系统设置 → 锁定屏幕”,找到“在不活跃时关闭显示器”,建议设为 1 分钟或 5 分钟。注意这里会影响所有显示器,包括外接屏。

接着进入“系统设置 → 电池 → 选项”,确认“当显示器关闭时,防止 Mac 自动进入睡眠”这个选项没有被勾选。它的作用是保持系统唤醒,并不是让屏幕保持点亮。如果勾选它,显示器熄灭后系统会保持清醒,看起来和“锁屏后未熄屏”不一定完全一致,但容易混淆问题的原因。

桌面机的路径略有差异,但核心设置点不变:一组是“显示器睡眠时间”,一组是“阻止自动睡眠”。先把这两组值都改成“跟随系统睡眠”,再观察。

4.2 用 pmset 命令写参数,适合管理员和终端用户

系统设置改完后,如果一时半会找不到对应开关,或者你有几台 Mac 要统一管理,直接在终端写配置反而更高效。

把所有模式下的显示器睡眠设为 2 分钟,系统睡眠设为 10 分钟:

sudo pmset -a displaysleep 2 sleep 10

只想改电池模式:

sudo pmset -b displaysleep 1 sleep 10

只想改电源适配器模式:

sudo pmset -c displaysleep 5 sleep 30

这里的大致逻辑是:-a表示所有电源模式,-b表示电池,-c表示插电。displaysleep控制熄屏,sleep控制系统休眠。设成 0 等于“永不”,日常不建议设 0,除非你有明确的远程值守需求。

改完以后可以用pmset -g custom复查一遍。这类命令的生效范围比系统设置更底层,很多“界面改了不生效”的案例,最后都是靠 pmset 参数纠偏的。

4.3 正确关闭 caffeinate 和第三方防睡眠工具

如果你知道自己开过 caffeinate,直接killall caffeinate最省事。但要留意两点:

  • caffeinate 可能被脚本反复拉起,需要找到启动它的定时任务或登录项
  • 一些图形化防睡眠工具退到菜单栏后并没有退出,需要在菜单栏图标里选择“退出”

第三方工具常见的坑是:你明明把主界面里的开关关掉了,但菜单栏助手还在后台运行,并保持防护断言。这种情况建议重启系统后再检查一次pmset -g assertions,确认PreventUserIdleDisplaySleep的值为 0。

4.4 处理异常进程和登录项

如果你从活动监视器里看到某个下载工具、播放器或远程软件持有防睡眠断言,可以退出该应用。退出后断言一般会立刻释放。如果释放不了,可以强制退出后再打开,看它是否还继续持有。

如果想要根治,还需要到“系统设置 → 通用 → 登录项”里把不需要的开机自启项去掉。这一步很关键,因为很多防睡眠工具会在重启后自动恢复运行,你头一天把它杀干净了,第二天又回来了。

4.5 验证结果:锁屏后等一个完整周期

修复完以后,建议做一个简单但有效的验证:把显示器睡眠时间设为 1 分钟,然后手动锁屏,离开电脑,等 90 秒再回来看。

如果屏幕熄灭了,说明电源管理的软件链路已经通了。如果还是亮着,再回到本文第 3 节的命令行检查一遍,看看是不是又有新的防睡眠断言出现。这一步我几乎每次都会做,因为它能帮你把“修复了”变成“确认修复了”。

5. 外接显示器与特殊硬件:别把所有锅甩给 macOS

5.1 合盖状态下的“桌面模式”会让锁屏失效

很多人的“锁屏后未熄屏”问题,其实只发生在 MacBook 合盖接外接显示器的情况下。这时候 Mac 进入的是桌面模式,系统默认你还在使用外接屏,所以即使你锁了屏,外接显示器依然会保持信号输出。

遇到这种情况,你需要在外接显示器自己的 OSD 菜单里找“自动关机”“节能模式”“无信号自动待机”之类的选项,把显示器的自动待机时间打开。某些显示器默认会在无操作后自动待机,但部分显示器必须收到操作系统的 DPMS 指令才会待机,而扩展坞转发 DPMS 信号时可能会失效。

5.2 扩展坞和线材是隐形杀手

雷雳转 HDMI、DP 转 USB-C 这类线材,如果本身不支持省电指令的透明传输,Mac 就没办法通知显示器“你该睡了”。这种情况下屏幕会一直保持亮着,无论你怎么调 pmset 都没用。

验证方法很简单:把外接屏的线拔掉,只留内置屏幕,锁屏等待。如果内置屏幕能正常熄灭,说明问题就在线材、扩展坞或外接显示器本身。换一根口碑较好的线材,或者把显示器接到另一个端口,很可能就解决了。

我之前处理过一个情况:扩展坞是正常的,但 HDMI 线是老版本,无法正确传递省电信号,换了一根支持 HDMI CEC 和完整信号传输的线后,外接屏终于能跟内置屏一起熄灭。

5.3 显示器自己的电源选项也可能背锅

不少显示器出厂默认开启了“快速启动”或“无信号时继续显示蓝色屏幕”等功能,导致即使 Mac 已经停止输出画面,显示器也不会自动进入待机。这类问题只能在显示器菜单里关闭相关功能。

这里给一个实用的建议:如果外接屏长期锁屏不灭,先看显示器品牌方有没有提供配套的电源管理工具,或者查看显示器说明书里的“省电模式”章节。部分高端显示器还允许设置“多少分钟无信号后关机”,把这个值调到和 Mac 的显示器睡眠时间一致,就能做到锁屏后同步熄屏。

5.4 多显示器组合时,优先用同一个接口类型

如果你同时接了多个外接屏,建议把接口类型统一,不要一个走 HDMI、一个走 DP、一个走 USB-C 扩展坞,否则每个屏收到的省电信号体验会不一样。我见过一个案例,其中一个屏正常熄灭,另一个屏永远亮着,就是因为某个转接头把 DPMS 信号丢了。

在修复多屏场景时,可以先只保留一个外接屏,逐个排查。全部搞定后再把其他屏接上,避免多个变量叠加干扰判断。

6. 把这些经验固化下来,形成自己的长效方案

6.1 先备份一份电源策略

排查和修复之前,先执行一次备份,这样改坏之后可以知道原来的值是什么:

pmset -g custom > ~/Desktop/pmset_backup.txt

注意这份输出不能直接用于恢复,因为 pmset 不会读取这个文件作为配置。真正的用途是让你记住“修改前长什么样”,特别是当你操作多台机器时,备份文件能避免越改越乱。

6.2 用脚本一键切换不同场景

如果你经常在“正常使用”和“长期下载”“外接显示器演示”等场景之间切换,可以写一个小脚本,把不同场景的电源策略写进去,需要时一键执行。

比如正常模式:

sudo pmset -a displaysleep 2 sleep 10 disksleep 10

夜间下载模式(只熄屏不休眠):

sudo pmset -a displaysleep 1 sleep 0 disksleep 10

这里sleep 0代表系统不自动睡眠,displaysleep 1代表屏幕 1 分钟后熄灭。这样的脚本比每次打开系统设置逐项调整快得多,也更容易保持一致性。

6.3 定期检查防睡眠断言

如果你发现自己明明没开启防睡眠工具,但锁屏后屏幕偶尔不熄灭,可以养成定期执行pmset -g assertions的习惯。尤其是在升级系统、安装新软件后,很多后台服务会重新申请防睡眠权限。

我现在的做法是,每周五下班前跑一次:

pmset -g assertions | grep -B 3 -A 6 "PreventUserIdleDisplaySleep"

如果有非预期进程出现,直接退出并清理登录项。这个习惯帮我避免了很多次“周末机器亮了一整夜”的尴尬。

6.4 硬件层面的最后手段

如果软件手段都试过了,外接显示器还是不熄屏,可以考虑一个比较“笨”但有效的办法:把外接显示器的电源接在带开关的插排上,下班后直接关掉插排开关。或者给显示器打开“无信号自动关机”功能,让它在没有画面输入时自己断电。

这类方案不优雅,但胜在稳定。毕竟很多消费级显示器对 DPMS 的兼容性并没有想象中那么好,没有必要跟硬件较劲。

回到最初的问题,“mac锁屏后未熄屏”不是一个无解的玄学问题,它本质上是“锁屏、显示器睡眠、系统睡眠”三套机制没有对齐。先用pmset -g custom看清参数,再用pmset -g assertions找到元凶,最后根据实际使用场景固定一套配置,这个问题就能彻底解决。我的个人体会是:别急着重装系统,也别急着换显示器,先从命令行查两个输出,大概率就能找到答案。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进