macOS pmset‑g assertions 电源断言日志深度解析:Mac 不会自动休眠排查实战

12次阅读
没有评论

场景:Mac 显示器不会自动熄屏、空闲很久也不进入睡眠,系统设置里睡眠时间明明已经配置,但不生效。使用 pmset -g assertions 命令是定位这类问题最核心手段。

前言

很多人遇到 Mac 不会自动休眠,第一反应怀疑系统设置、电源管理 bug。实际上绝大多数情况是应用程序持有电源断言 (Power Assertion),向系统申请:“不要让显示器休眠 / 不要让系统空闲休眠”。

macOS 通过断言机制管理睡眠策略,命令 pmset -g assertions 可以打印全部系统、进程、内核硬件层面的电源锁。下面基于一份真实生产日志完整解读,同时给出排查与修复方案。

测试环境:macOS,日志采集命令:

pmset -g assertions

原始日志片段摘要

Assertion status system-wide:
   BackgroundTask                 0
   ApplePushServiceTask           0
   UserIsActive                   1
   PreventUserIdleDisplaySleep    1
   PreventSystemSleep             0
   ExternalMedia                  0
   PreventUserIdleSystemSleep     1
   NetworkClientActive            0

Listed by owning process:
   pid 627(AweSun): [0x0001167400019aaf] 17:38:12 NoIdleSleepAssertion named: "Preventing sleep for a specific task"
   pid 627(AweSun): [0x000002cf000185ab] 37:14:17 NoIdleSleepAssertion named: "Preventing sleep for a specific task"
   pid 627(AweSun): [0x0001166900059aad] 17:38:23 NoDisplaySleepAssertion named: "Disabling display sleep"
   pid 164(WindowServer): UserIsActive Karabiner 虚拟键盘
   pid 204(coreaudiod): PreventUserIdleSystemSleep 音频服务
   pid 158(bluetoothd): 蓝牙BLE HID设备占用

Kernel Assertions: 0x104=USB,MAGICWAKE
   USB Hub、外接USB设备、en0网卡网络唤醒MAGICWAKE

Idle sleep preventers: IODisplayWrangler

一、系统级断言状态解读

表格

字段 含义
UserIsActive 1 系统判定用户处于活跃状态,延缓休眠倒计时
PreventUserIdleDisplaySleep 1 阻止显示器空闲自动休眠
PreventSystemSleep 0 重点:没有全局锁死睡眠,手动触发睡眠仍然可用
PreventUserIdleSystemSleep 1 空闲超时后禁止系统自动休眠

⚠️ 两个极易混淆关键概念

  1. PreventUserIdleSystemSleep = 1仅阻止空闲自动休眠。机器闲置时不会睡,但你手动点睡眠、执行 pmset sleepnow 依然可以正常睡眠。这是最常见的状态。
  2. PreventSystemSleep = 1完全禁止系统睡眠,连手动睡眠都会失效,属于严重异常状态。本次日志该值为 0,没有这个问题。

二、用户进程:谁在阻止睡眠

1. AweSun(向日葵远程控制,本次头号诱因)

pid 627(AweSun): NoIdleSleepAssertion → 阻止系统空闲休眠,最长持有37小时
pid 627(AweSun): NoDisplaySleepAssertion → 阻止显示器休眠

行为说明:向日葵远程为保障远程会话不断开,默认申请电源断言,保持屏幕常亮、机器不休眠。

  • 只要向日葵进程存活,这几条断言就持续计数;
  • 直接退出向日葵客户端,所有这一组断言会立刻释放;
  • 部分版本软件内开关无法彻底关闭该锁,只能退出进程。

2. WindowServer + Karabiner‑Elements 虚拟键盘驱动

UserIsActive 用户活跃断言,虚拟键盘事件持续标记 “用户正在操作”,超时时间 1799 秒,超时自动释放。属于正常输入设备行为,不会长期卡死睡眠。

3. coreaudiod 音频服务

音频子系统 coreaudiod 持有 PreventUserIdleSystemSleep。 只要存在音频流:播放音乐、录音、远程工具音频通道(向日葵远程音频),就会挂这个断言。音频链路断开后,断言逐步释放。

4. bluetoothd 蓝牙守护进程

蓝牙键鼠、BLE 外设会产生两类断言:

  1. PreventUserIdleSystemSleep:蓝牙栈占用;
  2. UserIsActive:蓝牙输入设备活动,无操作超时后自动回收。

5. mds_stores Spotlight 索引后台任务

短时 BackgroundTask,元数据索引,对睡眠几乎无影响,任务结束断言消失。

三、Kernel Assertions 内核硬件层断言

内核断言来自硬件驱动,软件应用无法绕过。

Kernel Assertions: 0x104=USB,MAGICWAKE
- USB3.1 Hub / USB2.1 Hub / PERM00 USB外设:USB设备断言
- MAGICWAKE en0:网卡开启网络唤醒(WOL)
  • USB 外接集线器、外设会持有 USB 断言,部分劣质 USB 外设会干扰 macOS 睡眠;
  • MAGICWAKE(网络唤醒):只负责网络数据包唤醒机器,不会阻止机器睡眠,不要误判。

末尾日志 Idle sleep preventers: IODisplayWrangler IODisplayWrangler 是 macOS 显示管理组件,出现这个标记代表:有进程持有禁止显示器休眠的断言,本例就是向日葵的 NoDisplaySleepAssertion

四、排查修复实操方案

方案 1:快速定位元凶

# 查看全部电源断言
pmset -g assertions

# 查看系统完整电源配置
pmset -g

# 手动强制立刻睡眠
pmset sleepnow

Listed by owning process 列表,重点关注长时间计数的 NoIdleSleepAssertion / NoDisplaySleepAssertion,就是阻止休眠的元凶。

方案 2:针对本例问题修复

  1. 临时方案:完全退出向日葵 AweSun 客户端,电源断言马上释放;停止音频播放,静置等待蓝牙 / 用户活跃断言超时,Mac 就会按设置自动休眠。
  2. 不退出向日葵:软件设置中关闭 “保持电脑不睡眠、保持屏幕常亮”。注意部分版本该开关无效,属于程序硬编码电源断言。
  3. 外设排查:怀疑 USB 外设干扰睡眠,可以拔掉全部外接 USB 设备做对比测试。

方案 3:长期监控脚本(可选)

如果你需要持续监控是谁占用睡眠锁,可以写简单 shell 脚本循环打印断言,方便复现问题。

#!/bin/bash
while true
do
    date
    pmset -g assertions | grep -E "NoIdleSleepAssertion|NoDisplaySleepAssertion|PreventUserIdleSystemSleep"
    echo "---------"
    sleep 30
done

五、总结排错思路(通用模板,适用于所有 Mac 休眠异常)

  1. 执行 pmset -g assertions,看全局断言:PreventUserIdleDisplaySleepPreventUserIdleSystemSleep 是否等于 1;
  2. 查看进程列表,重点看时间计数很长的电源断言,定位对应 PID/APP;远程控制、录屏、直播、音乐播放器是高频嫌疑软件;
  3. 区分:应用层断言 vs 内核 USB/MAGICWAKE 硬件断言;
  4. 区分两个锁:PreventUserIdleSystemSleep(空闲不让睡,手动可睡)和 PreventSystemSleep(完全禁止睡眠);
  5. 测试:退出嫌疑应用,观察断言是否清零验证问题。

绝大多数 Mac 不自动休眠不是 macOS 系统 bug,而是第三方应用申请电源锁导致。先查断言,再改系统设置。


博文标签:macOS pmset Mac不睡眠 power assertion 向日葵远程

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码