Deep Sleep 图标

macOS 的睡眠管理一直很别扭。

pmset 能干的事不少,但它的命令行反人类,参数得一个一个查。caffeinate 简单,可是只管一半 —— 它能挡住空闲睡眠,挡不住合盖。想真的让系统别睡,就得自己 sudo pmset -a disablesleep 1,然后每次改回来都得再输一遍密码。

AlDente 占掉了防冷却这一块。剩下的睡眠、唤醒、电源设置、定时计划,散在系统设置、pmset、caffeinate、各种第三方小工具里。

我就想做一个东西,把这一整块收进一个应用里。

Deep Sleep 现在是 v1.9.2,MIT 协议,Swift 写的原生 macOS 应用,要求 macOS 26.0 以上。

GitHub · 下载

怎么用

装好之后,图标在菜单栏。左键开主窗口,右键弹快速设置。关掉所有窗口之后 Dock 图标会隐藏,它继续在后台待着。

保持清醒

三个档位分开管:

你想要的 对应
别因为我没动鼠标就睡 阻止空闲睡眠
屏幕别暗下去 保持屏幕常亮
合盖也不睡 阻止系统睡眠(需要完全控制)

前两个不需要任何授权。第三个需要装一次特权助手,装完之后就不用再输密码了。

服务器模式

把一台 Mac 当服务器用的时候,最烦的是它自己睡了。

服务器模式一开,系统永不睡眠,然后每隔一段时间自动关屏加锁屏。空闲十分钟再重复一次。关屏之后倒计时停在零,不会反复去关;你回来一操作,重新开始计时。

open "deepsleep://server-mode?value=1"

关屏走 pmset displaysleepnow。锁屏那一步依赖系统设置里「锁屏 → 立即要求密码」这个选项 —— Deep Sleep 不会去改你的偏好设置。

定时睡眠与唤醒

pmset schedule wake 的能力,直接做成了界面。定时唤醒交给系统电源服务执行,不是自己在后台守着。

自动化规则

规则由「触发条件」和「要保持的状态」两部分组成,引擎每 5 秒评估一次。触发条件可以是时间段、电源状态(插电 / 用电池)、或者某个应用在前台运行。

规则只表达意图,实际申请和释放由控制器统一处理。所以规则和你手动点的开关不会互相打架。

能用 Siri 叫它

「用 Deep Sleep 保持清醒」「用 Deep Sleep 查询睡眠状态」「用 Deep Sleep 开启服务器模式」。

除了 Siri,快捷指令 App、聚焦、控制中心里都有它的动作。完整的短语列表:

open -a "Deep Sleep" --args --automation

脚本调用

deepsleep:// URL 能从 shell、AppleScript、自动操作里调:

open "deepsleep://hold?kind=idle-system,display&minutes=60"
open "deepsleep://release"

命令行参数也有,但要注意 macOS 是单实例的,参数只对启动它的那个实例生效。反复调用还是用 URL 靠谱。

快速退出

绑一个全局快捷键(默认 ⌥⇧⌘H),按下就把选定的应用连同整棵子进程树一起结束。

这个是强制结束,不等保存,也不给收尾机会。Finder、Dock、WindowServer、powerd 这些系统进程有硬编码的保护名单,命中的整棵子树都会跳过,没有开关能绕。

「演练一次」只列出会结束哪些进程,不动手。

工具箱

侧边栏「工具」段现在收成了一个入口,页里是一排卡片,卡片右上角的图钉可以置顶。

卡片 做什么
进程优先级 看和改任何非系统进程的 nice 值
Hosts 编辑 读写 /etc/hosts,管理谁能改 hosts
Quarantine 扫目录,清掉文件上的 com.apple.quarantine 属性
AI 保活 按计划给订阅制 AI 服务发一条极短请求

温度监控与风扇控制

v1.9.0 加的。「温度监控」页列出 SoC、电池、存储这些传感器的实时读数,同一个传感器的多条通道合并成一行,取其中最高值。读温度不需要完全控制权限,特权助手没就绪时这一页照样能用。

风扇控制三种模式:交给系统、固定转速、按规则调速。按规则要三个参数——目标风扇、最低温度、最高温度。低于最低温度走最低转速,高于最高温度走最高转速,中间随温度线性变化。

任一传感器到 90°C,所有风扇立刻拉到各自最大转速,压过你设的任何模式和规则。回落到 90°C 以下之后仍然保持 60 秒再恢复原模式,避免在阈值附近反复启停。

风扇转速是往 SMC 里写,属于苹果没公开的接口。不同机型的键名和转速区间不一致,写错可能让风扇停转或者异常加速。所以第一次用要先同意免责声明,没同意之前所有写风扇的控件都是禁用的。

手动模式有租约保护。写进去之后特权助手按 15 秒租约维持,应用每 5 秒续一次。应用退出、崩溃或者被强制结束,风扇自动交回系统控制,不会停在一个固定转速上。

告警规则

「告警规则」页可以自己定指标、比较方式、阈值、持续时间和动作。指标覆盖 CPU 使用率、内存使用率、单进程内存、CPU 温度和磁盘使用率。条件连续满足设定的时长才触发,掉回条件内重新计时。规则只发告警,不结束进程。

电源设置页还多了一个选项:阻止外置硬盘因为长时间没操作转入低功耗状态。这个不阻止系统睡眠,也不能阻止电池耗尽关机。

CPU 占用率

v1.9.2 修的。之前取 CPU 时间的那个接口在 macOS 27.2 上读出来的数偏小很多,机器跑满了监控页还是接近 0。现在整机占用改成读内核的总账,单个进程改成读 Mach 的线程接口,显示的数跟系统监视器对得上。

AI 保活

Claude、Codex、Gemini 这类订阅制服务,通常有一个5小时的滚动窗口。放着不用,窗口的重置计时器就不动。

AI 保活按你设的间隔,给指定的服务发一条极短的请求。每条任务配服务地址、请求格式(OpenAI / Anthropic)、模型名、API Key、发送间隔和请求内容。

API Key 存在 macOS 钥匙串里,不进偏好设置,不进日志。

谁在跟它抢

电源控制这事儿经常好几个程序一起干。Deep Sleep 只保证自己那一份,剩下的给你看清楚:

open -a "Deep Sleep" --args --blockers   # 谁在阻止休眠
open -a "Deep Sleep" --args --changes    # 谁改了电源设置
open -a "Deep Sleep" --args --rivals     # 谁在跟它抢

--blockers 直接向内核取所有电源断言,按进程分组。--changes 每 6 秒对 pmset -g 做一次快照比对。--rivals 扫正在跑的非 Apple 应用,在二进制里找 disablesleep 字符串 —— AlDente 就是这么被揪出来的。

它只把事实列出来,不会去关掉别的程序。

关于完全控制

真正彻底的睡眠控制都需要 root,所以这里用的是「一次性安装、长期驻留」的助手,而不是每次操作都弹密码框。

在「完全控制」页点「启用完全控制」,系统弹一次管理员授权(录了 Touch ID 的机器可以直接指纹确认),之后所有提权操作只要本地确认一下。

助手侧做了几层防护:socket 归当前登录用户所有、权限 0600;每个连接都用 getpeereid() 校验对端 uid,不是登录用户直接拒;可写的 pmset 键有白名单,取值必须纯数字;只接受固定的命令枚举,不执行任何外部传入的 shell 字符串;必须以 root 运行,否则直接退出。

「停用并卸载」会把 /Library 下的文件和 launchd 任务全清掉,系统回到装之前的状态。

装

有 Homebrew 的话一行就装上了:

brew install mofan2020/tap/deepsleep

手动装的话,从 Releases 下 DeepSleep.zip,解压,把 Deep Sleep.app 拖进 /Applications。

应用是 ad-hoc 签名的。第一次打开如果被 Gatekeeper 拦,到「系统设置 → 隐私与安全性」点「仍要打开」。

想自己编译的话,需要 Xcode 26 以上和 XcodeGen:

brew install xcodegen
xcodegen generate
xcodebuild -project DeepSleep.xcodeproj -scheme DeepSleep \
           -configuration Release -derivedDataPath build build

还有这些

  • 开机自启,写 LaunchAgent,默认开
  • CPU / RAM 过载告警,提示前三大占用的进程,可以冻结或结束
  • 单进程 RAM 超阈告警,不等持续时间,立刻提示
  • 外部活动记录,谁在阻止休眠,谁改了电源设置
  • 应用和特权助手都能自我更新,助手靠内容摘要比对,改了才会真的换
  • 运行日志页,按条数和天数自动裁剪

已知限制

  • 合盖时能否被定时唤醒取决于机型和电源状态,Apple Silicon 机型合盖时通常不会被唤醒
  • 取消唤醒会清掉所有由 pmset 排定的唤醒任务,包括别的程序排的

最后

这项目从 v1.0.0 到现在,改了二十多个版本。最花时间的地方不是功能,是「怎么跟 macOS 的电源系统相处」—— 断言会自己掉、pmset 的值会被别的程序改回去、合盖和空闲是两条不同的路径。

代码和开发笔记都在仓库里:DeepSleep

有问题、想要什么功能,或者单纯觉得好用,都可以说。