跳至主要內容
技術

下班了,AI 還沒跑完:別再把筆電掀開抱著走

下班了,AI 還沒跑完:別再把筆電掀開抱著走
Updated: 2025-12-30

五點半,該下班了。

但我的 Claude Code 還在跑。沒有進度條,也沒有預估時間,只有終端機裡一行一行往上捲的輸出。看起來再十分鐘就好,也可能再一個小時。

筆電上蓋一闔,Mac 就睡了,跑到一半的任務停在原地。不闔,就只能把筆電掀開半邊、單手托著,一路走到捷運站。

這個姿勢應該很多人都做過,我也是。

撐久了總要面對。這篇把這件事拆開來想清楚:蓋子闔上時到底發生什麼事、今晚要走的話怎麼止血,以及怎麼讓以後不用再陪 AI 加班。

蓋子一闔上,發生了什麼事

MacBook 闔上蓋子,預設就是進入睡眠。睡眠時 CPU 停下來,你的 claude process 不會再被排程執行,整個凍結在原地。

凍結本身還好,麻煩在網路。agent 每一步都要跟模型 API 來回,睡著的這段時間,連線很可能斷掉或逾時。隔天打開蓋子,常見的畫面是一個報錯的請求,或一個停在半路、等你決定要不要重試的 session。

還有一種「沒跑完」更常被忽略:它根本沒在跑,是在等你。agent 要執行某個指令之前跳出權限確認,你人已經在捷運上,它就乖乖在那裡等一整晚。

先分清楚三件事

很多人遇到這個問題,第一個想到的是 tmux。但 tmux 解決的是另一件事。講解法之前,先把三件常被混在一起的事拆開:

你要的是對應的工具它解決不了的事
關掉終端機,session 還活著tmux、screen機器睡著,裡面一樣全部凍結
機器不要睡caffeinate、Amphetamine帶出門沒網路、發熱、耗電
任務根本不在你的筆電上跑雲端執行、常駐機器雲端只拿得到 repo,常駐機器的環境要自己架

tmux 讓 session 在你關掉終端機、SSH 斷線之後繼續活著,但它不會阻止那台機器睡眠。在一台會睡著的筆電上開 tmux,蓋子一闔,tmux 裡的東西一樣停。

搞清楚這三層,選擇就簡單了。我會照這個順序判斷:

flowchart TD
    A["下班了<br/>agent 還在跑"] --> B{"任務需要本機<br/>才有的東西嗎?"}
    B -->|"不需要"| C["一開始就丟上雲端<br/>GitHub Actions 跑"]
    B -->|"需要"| D{"有一台不會睡的<br/>機器嗎?"}
    D -->|"有"| E["在那台用 tmux 跑<br/>手機遠端接回來"]
    D -->|"沒有"| F{"筆電能留在原地<br/>接著電嗎?"}
    F -->|"可以"| G["蓋子開著+caffeinate<br/>跑完推播通知你"]
    F -->|"一定要帶走"| H["Amphetamine 或 pmset<br/>⚠️ 發熱、耗電、沒網路"]

「本機才有的東西」指的是:本機的資料庫、.env 裡的金鑰、只裝在你電腦上的工具、只有公司內網連得到的服務。任務只需要 repo 裡的東西,就不必綁在你的筆電上。

下面從最快能用的止血講起,再講根治。

如何讓筆電不睡著

筆電開著未闔蓋:caffeinate

caffeinate 是 macOS 內建的指令,不用裝任何東西。最好用的寫法是把它包在 agent 外面:

caffeinate -i claude

-i 是防止系統閒置睡眠。這樣啟動的話,claude 跑多久,Mac 就醒多久;你一離開 Claude Code,防睡眠跟著解除,不會忘記關。

已經在跑的 session 也能補救。另開一個終端機,給它一個時間上限:

# 接下來兩小時不睡,時間到自動解除
caffeinate -i -t 7200

-t 的單位是秒。估不出要跑多久,就不加 -t,回來再按 Ctrl+C 結束它。

caffeinate 有個限制要先講清楚:它擋的是閒置睡眠,擋不了闔蓋。man caffeinate 寫明 -s 只有接電源時才有效,而且整份 man page 沒提到闔蓋這件事;用電池時一闔上蓋子,caffeinate 就擋不住了。所以這招適合的情境是:筆電留在公司或家裡,接著電、蓋子開著,人先走。

人走了還想知道它跑完沒,可以搭配後面會講的推播通知。

筆電闔蓋帶走:Amphetamine 或 pmset

真的要闔上蓋子帶走、又要它繼續跑,事情就麻煩了。Apple 官方支援的闔蓋使用有條件:要接電源、接外接螢幕,還要外接鍵盤和滑鼠。走在路上,這些一樣都沒有。

剩下兩個選項。

第一個是 Amphetamine(安非他命),Mac App Store 上的免費 app,支援闔上螢幕也不睡(它叫 closed-display mode)。裝好之後從選單列開一個 session,並在 session 設定裡把「內建螢幕闔上時允許系統睡眠」這類選項關掉,它才會真的撐住。在 Apple Silicon 的筆電上,啟動這個模式要驗證 Touch ID 或管理員密碼;想省掉這一步,要另外下載安裝 Power Protect。

💡 冷知識:名字取得這麼直白,也惹過麻煩。2020 年底,Apple 一度要求它修改,理由是 app 名稱和藥丸圖示涉及管制藥物、看起來在鼓吹不當使用,不改就在 2021 年 1 月下架。開發者 William Gustafson 提出申訴,他的說法是:安非他命可以合法地讓人保持清醒,Amphetamine 這個 app 也可以合法地讓你的 Mac 保持清醒。Apple 後來收回了決定,這個名字留到了今天。

第二個是不用裝東西的硬派做法:

# 整台 Mac 停止睡眠,闔蓋也不睡
sudo pmset -a disablesleep 1

# 用完一定要改回來
sudo pmset -a disablesleep 0

disablesleep 在 man pmset 裡查不到,是沒寫進文件的選項。不過 Apple 開源的 pmset 原始碼裡確實有它,註解寫著非 0 就是停用睡眠。它是系統層級的開關,不像 caffeinate 會跟著 process 結束自動解除,所以最常見的事故是忘了改回來。不確定現在的狀態,可以這樣查:

# 查目前是不是停用睡眠
ioreg -r -c IOPMrootDomain | grep SleepDisabled

看到 "SleepDisabled" = Yes 就代表還開著。

這兩招有同樣的代價。闔上蓋子的筆電照樣在全速跑 agent,塞進背包悶著,發熱跟耗電都要自己承擔。而且筆電一離開 Wi-Fi,除非你開手機熱點,agent 一樣連不到 API,醒著也只是在原地重試。

所以我會把它們當成「今晚先撐過去」的止血,不當成日常做法。

根治一:一開始就丟上雲端

任務只需要 repo 裡的東西的話,最乾淨的做法是讓它從頭到尾不在你的筆電上跑。

Claude Code 這邊能用的是 GitHub Actions,目前還在 beta。在 Claude Code 裡打一次 /install-github-app,照步驟裝好 GitHub App、設好金鑰,之後在 issue 或 PR 留言 @claude 加上任務描述:

@claude 照 docs/plan.md 做完遷移並跑測試

它就會在 GitHub 的 runner 上開工,進度和結果回在同一串留言裡。你的筆電闔上、關機都不影響;人在路上用手機打開 GitHub 就能看,想追加指示就再留一則言。

用之前有幾件事要知道:

  • 這招要在開工時就決定。已經在本機跑到一半的 session 沒辦法搬上去,不是五點半才想到的選項。
  • 認證要另外設。預設是用 API key;Pro、Max 訂閱的話,也可以改用 claude setup-token 產生的 token,這是剛支援沒多久的做法。
  • 跑的是 GitHub 的機器。私有 repo 會算進 Actions 的用量。
  • runner 不是你的電腦。本機的資料庫、金鑰、只裝在你電腦上的工具,都不會自動跟過去,需要的環境要自己在 workflow 裡設好。

不限定 Claude 的話,這陣子幾個大廠推出的雲端 coding agent 都是同一種思路:OpenAI 的 Codex(ChatGPT 裡的雲端版,research preview)、Google 的 Jules(public beta)、GitHub 的 Copilot coding agent(public preview)。把任務丟進雲端的環境,你只要回來看結果。

2025-12 更新:Claude Code 也能直接在雲端跑了

這篇寫的時候,要讓 Claude Code 在雲端跑,只有上面 GitHub Actions 這條路。10 月 Anthropic 推出了 Claude Code on the web(claude.ai/code),目前還是 research preview,Pro、Max 可以用,Team 和 Enterprise 的 premium seat 也在 11 月開放了。任務只需要 repo 的話,我現在會優先用它。

從終端機送任務上去,最快的方式是在 Claude Code 的輸入框裡,訊息開頭加一個 &:

& 照 docs/plan.md 做完遷移並跑測試

Claude Code 會把這個任務送到雲端,並給你一個 claude.ai/code 的網址。之後在網頁上就能看進度、插話;用 Claude 的 iOS app 也看得到,通勤路上一樣能追。隔天回到電腦前,網頁上有個「Open in CLI」按鈕,會給你一行 claude --teleport <session id>。在同一個 repo 裡執行,本機還沒 commit 的變更會先被 stash 起來,再把雲端的 session 載入本機接著做。

跟 GitHub Actions 比,它不用開 issue、不用在 repo 裡設金鑰,用起來就像平常跟 Claude Code 對話。要注意的地方:

  • 一樣要在開工時就決定。& 是開一個新的雲端任務,已經在本機跑到一半的 session 沒辦法搬上去。
  • 只支援 GitHub。repo 要放在 GitHub 上,連好 GitHub 帳號、裝好 Claude 的 GitHub App;第一次用要先到 claude.ai/code 完成設定。
  • 雲端機器不是你的電腦。它跑在 Anthropic 代管的隔離環境裡,網路預設只放行一份允許清單。本機的資料庫、金鑰、只裝在你電腦上的工具,一樣不會自動跟過去;需要的套件可以用 SessionStart hook 在環境啟動時裝好。
  • 要用 claude.ai 帳號登入。它跟你其他的 Claude 用量共用額度。

根治二:讓任務住在一台不會睡的機器上

需要本機環境的任務,答案是換一台機器跑:家裡的桌機、公司的開發機,或雲端上一台 VPS。重點是這台機器接著電、不闔蓋,也不會跟你回家。

家裡如果本來就有一台常開的桌機或 Mac mini,那就是現成的選項。

這條路的組合大概是這樣:

  • 在那台機器上用 tmux 跑 agent。這時 tmux 才真正派上用場:機器本身不睡,你斷線、關掉終端機都不影響裡面的任務。
  • 用 Tailscale 把手機、筆電、那台機器串進同一個私有網路,不用把 port 開到公網上。
  • 手機連線用 mosh,搭捷運進出隧道也不會一直斷。連上之後 tmux attach,就回到 agent 正在跑的那個畫面。
  • 如果那台是 Mac,記得關掉自動睡眠。到系統設定的能源選項,打開螢幕關閉時防止自動睡眠的設定,不然它半夜一樣會睡。

讓中斷不再可怕

就算上面都做了,還是會遇到斷網、當機、額度用完。與其追求任務永遠不中斷,不如讓中斷的代價變小。

別讓它卡在等你

前面說過,很多「沒跑完」其實是卡在權限確認。出門前想一下這個任務會跑哪些指令,先把權限設好。

再來是讓它主動找你。Claude Code 上個月底剛推出 hooks,其中的 Notification hook 會在兩種時候觸發:它需要你授權使用某個工具,或輸入框閒置超過 60 秒、在等你回話。很多人拿它跳桌面通知,但人不在電腦前,桌面通知沒有意義。改成推到手機,放進 ~/.claude/settings.json:

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "curl -s -d '在等你' ntfy.sh/你的-topic"
          }
        ]
      }
    ]
  }
}

你的-topic 換成自己取的名字。ntfy 是免費的推播服務,手機裝它的 app、訂閱同一個 topic 就收得到。topic 等於公開頻道,知道名字的人都能訂閱,名字請取一個別人猜不到的。

這裡刻意用 Notification 而不是 Stop。Stop hook 是每次 Claude 回完話都會觸發,不只在任務完成時,拿來推播會很吵。

進度寫進檔案,小步 commit

長任務開工前,先叫 agent 把計畫寫成一個檔案,每做完一步就打勾、commit 一次。

這樣中斷之後回來,claude --continue 可以接回最近的對話;就算對話接不回來,開一個新 session 讀那個檔案、看一下 git log,也知道做到哪裡。任務的狀態存在 repo 裡,不是只存在某個 process 的記憶體裡。

下班就是下班

抱著掀開的筆電走在路上,其實是在陪 AI 加班。

agent 最值錢的地方,是你不在的時候它還能做事。如果它需要你一路托著筆電,那段時間其實還是你的。

下次五點半還沒跑完,先問一句:這個任務需要我的筆電嗎?不需要,就讓它去雲端跑;需要,就讓它住在一台不用跟你回家的機器上吧。

留言討論

esc
輸入關鍵字搜尋文章...
查看收藏 →