claude-awake: keep your Mac awake (even lid-closed) while Claude Code is working — heartbeat hooks + pmset watchdog

README.md

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.jsonhooks 一节加入(已有 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…
添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论