claude-awake: keep your Mac awake (even lid-closed) while Claude Code is working — heartbeat hooks + pmset watchdog
claude-awake — Claude Code 跑长任务时不让 Mac 睡觉(合盖也行)
两个小脚本,让 MacBook 在 Claude Code 干活时保持清醒(合上盖子也继续跑),任务一结束就恢复正常睡眠,不空耗电池。
原理
心跳 + 看门狗,两个进程各司其职:
claude-awake-hook.sh(心跳):挂在 Claude Code 的 hooks 上。提交 prompt、每次工具调用后touch一个以 session_id 命名的状态文件;回合结束、会话退出时删掉。文件存在且新鲜 = 这个会话正在干活。多开几个 Claude 实例互不干扰,各管各的文件。claude-awake-daemon.sh(看门狗):LaunchAgent 常驻,每 20 秒决策一次——只要有 ≥1 个「30 分钟内刷新过」的状态文件、且 CPU 没有过热降频,就pmset -a disablesleep 1(合盖也不睡);否则翻回 0(正常睡眠)。
用 pmset disablesleep 而不是 caffeinate,是因为 caffeinate 在电池供电下挡不住合盖强制睡眠,而 disablesleep 覆盖包括合盖在内的一切睡眠触发(Amphetamine 的 Closed-Display Mode 底层也是它)。
30 分钟的过期时间不是「等 30 分钟才睡」——正常结束时 hook 会立刻删文件,20 秒内就放行睡眠。它是崩溃保险:Claude 被 kill、终端直接关掉时删除逻辑不会执行,没有过期机制的话孤儿文件会让机器永远不睡。
安装
1. 放置脚本
mkdir -p ~/.claude/hooks # 把两个 .sh 文件放进 ~/.claude/hooks/ chmod +x ~/.claude/hooks/claude-awake-*.sh
2. 挂上 Claude Code hooks
在 ~/.claude/settings.json 的 hooks 一节加入(已有 hooks 的话合并进去):
{
"hooks": {
"UserPromptSubmit": [
{ "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/claude-awake-hook.sh touch" }] }
],
"PostToolUse": [
{ "matcher": "*", "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/claude-awake-hook.sh touch" }] }
],
"Stop": [
{ "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/claude-awake-hook.sh rm" }] }
],
"SessionEnd": [
{ "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/claude-awake-hook.sh rm" }] }
]
}
}3. 给 pmset 配免密 sudo(只放行两条精确命令)
disablesleep 需要 root。运行 sudo visudo -f /etc/sudoers.d/claude-pmset,写入(把 YOUR_USERNAME 换成你的用户名,whoami 可查):
YOUR_USERNAME ALL=(ALL) NOPASSWD: /usr/bin/pmset -a disablesleep 1, /usr/bin/pmset -a disablesleep 0
4. 安装 LaunchAgent
保存为 ~/Library/LaunchAgents/com.claude.awake.plist(把路径里的 YOUR_USERNAME 换掉):
Label…
评论
?
参与讨论