下班了,AI 還沒跑完:別再把筆電掀開抱著走
五點半,該下班了。
但我的 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 最值錢的地方,是你不在的時候它還能做事。如果它需要你一路托著筆電,那段時間其實還是你的。
下次五點半還沒跑完,先問一句:這個任務需要我的筆電嗎?不需要,就讓它去雲端跑;需要,就讓它住在一台不用跟你回家的機器上吧。