讓 agent 在你關掉手機後繼續跑
tmux 是一個 terminal multiplexer:它讓 terminal session 繼續跑在你連進去的那台機器上,不是跑在你那條連線裡面。對 AI coding agent 來說,這就是斷線之後 agent 能不能活下來的差別。SSH 連線遲早會斷(手機鎖定、沒訊號),而斷掉的 SSH 通常會把 agent 所在的 shell 一起殺掉。
你把手機收起來,SSH 隧道斷了,agent 跟著死。這不是運氣問題,是機制。
連線一斷,kernel 會關掉你這次登入所用的虛擬終端機(pseudo-terminal),再對接在那個終端機上的每個 process 送出 SIGHUP(hangup):你的 shell,也包括 shell 裡面的 agent。process 除非自己處理過這個訊號,否則預設就是終止,跑到一半的東西全部作廢。SSH 只是連線走過的那條路,撐住 agent 的是那台機器,不是那條連線。
tmux 讓 session 活在別的地方
tmux 在伺服器上開一個 session。你的 agent 跑在那個 session 裡面,不是跑在你那條一直會斷的 SSH 連線裡。
背後的機制是一個 process。你第一次輸入 tmux,它就在你的帳號底下啟動一個背景程式,那是 tmux server,會一直活著。之後你開的每個 session 都屬於它,每個 session 的虛擬終端機也由它分配,不是由 sshd 分配。你的 agent 用的那個終端機從此刻起歸 tmux server 保管,跟手機那條連線沒有關係。
下次連線斷掉的時候,sshd 關掉的是它自己的虛擬終端機,掛在那上面的只有你的 tmux client。client 結束了,session 照樣跑。
session、window、pane 各是什麼?
這三個詞常常被混著用,但只有第一個能保住你的 agent。後面每一段都用得到這三個詞,所以先把它們分開。
| 詞 | 是什麼 | 對 agent 的意義 |
|---|---|---|
| session | 機器上一個有名字的工作場所,自備 process,由那台機器上的 tmux server 保管 | 斷線之後活下來的就是它。名字取一次,可以用好幾個月 |
| window | 一個 session 裡面的一個分頁,多數人一個 agent 開一個 | 你切走,它在後面照樣跑 |
| pane | 一個 window 裡面的分割:左邊 agent,右邊測試或 git status |
手機那一小塊螢幕上同時看到兩件事 |
第四個詞也有用:client 就是當下正在看這個 session 的終端機。一個 session 可以沒有 client、有一個、或有好幾個。零個不是錯誤,那就是 detach:session 照樣在跑,只是沒人看。
名字因此很重要。tmux new -s work 建立的 session 一週後還找得回來;不取名,tmux 就幫你編號,而「接回第 2 號」這件事過了三天就沒有意義。
detach、attach,跟關掉電視是同一件事
把電視關掉,客廳裡的畫面沒了。節目沒停,一直在播。你回來打開,接的是同一個頻道,從它播到的地方看下去。
tmux 把這兩個動作叫 detach 和 attach:關窗、開窗。兩個都碰不到機器上真正在跑的東西。
這個比喻會漏掉一件事,而且漏掉的部分對你有利。電視關著的時候什麼都沒學到,tmux 的 session 卻把輸出留了下來。一個小時後接回來,畫面是它現在的樣子,那一個小時印出來的東西還在 scrollback 裡,往上翻就看得到。
要下哪些指令?
先記這四個:
tmux new -s work # 建立一個名叫 work 的 session
claude # 在裡面啟動 agent
tmux ls # 列出 session:work: 1 windows
tmux attach -t work # 從任何終端機再接上去看它
detach 不是指令,是按鍵。按 Ctrl-b,放手,再按 d。前面那個鍵是 prefix:tmux 收下它,下一個鍵才決定要做什麼。另外兩個第一週就會用到:
Ctrl-b d就是 detach。終端機變回一般的 shell,session 繼續跑。Ctrl-b c開一個新的 window;Ctrl-b %把一個 window 分割成兩個 pane。
如果機器回你 tmux: command not found,解法在疑難排解那一頁。
連線斷掉,agent 繼續跑
你在捷運上斷了訊號,進電梯斷一次,切 Wi-Fi 又斷一次。每次都接回同一個 tmux session,斷線十次,agent 一次都沒有被打斷。它不知道你斷過線,因為它從頭到尾就沒活在你那條連線裡。
手機上三個最令人擔心的情況,其實是同一件事發生了三次:
- 手機鎖定。系統把 app 暫停,連線跟著斷掉,什麼訊號都送不到 agent。它繼續做事。
- 二十分鐘沒訊號。連線在背景安靜地死掉,tmux client 跟著死,session 只是被 detach,內容一點沒變。
- 系統殺掉 app,或你往上一劃。沒了的是手機上的一個 process,session 從頭就不在裡面。在筆電上關掉終端機視窗,結果一模一樣。
detach 不是暫停。你不在的時候,agent 繼續讀檔案、改檔案、花掉你的用量。這就是重點,所以走開之前先回它一句,或是先把它停掉。
兩台裝置可以同時看同一個 session 嗎?
可以,而且沒有什麼魔術。多個 client 可以同時接在同一個 session 上。排隊時從手機開工,到公司從筆電接回同一個,你看到的是跑到一半的同一個畫面,不是它的副本。
兩邊按的鍵都送進同一個程式,所以一次只有一個人打字。attach 不會移動 session:它留在建立它的那台機器上,所以手機和筆電看到的內容一致。反向也成立:你在筆電的終端機裡手動開的 session,app 一樣接得上,因為兩邊問的是同一台機器上的同一個 tmux server。
App 怎麼處理這些 session?
Agentmux 用的就是上面那個區分:session 在機器上,連線只是去看它。手機這一側的斷線是 detach,不是停止:重新連線,你回到同一個 session,而它已經跑得更遠了。你在它的終端機裡手動下上面那些指令,結果一樣,因為那是同一台機器上的同一個 session。
有兩件跑腿它幫你做掉。機器上沒有 tmux 時,app 會自己裝,並判斷你的機器用的是 apt、yum、dnf、pacman、apk 還是 brew。agent 裝在 shell 看不到的地方時,app 會去查那個 PATH 問題,不會只丟給你一個毫無訊息的畫面。persistent session 屬於免費的 single-server 方案,所以上面這些都不用另外付錢。設定頁把整件事變成一份檢查清單。
tmux 不做的事
tmux 只回答一個問題:這個 process 會不會活得比你的連線久。其他它一概不管。
- 伺服器重開,所有 session 一起結束。它們存在 tmux server 的記憶體裡,一次斷電、一次自動更新,都會把 agent 一併帶走。活下來的是已經寫進磁碟的東西:改過的檔案、做出的 commit、你停在哪個 branch。負責存檔的是 git,不是 tmux。
- 它不會還原 agent 已經跑過的指令。tmux 留住的是輸出,檔案不會自己回到之前的樣子。
tmux kill-session -t work真的會殺掉它。關掉最後一個 window,或是 agent 自己崩潰,結果一樣。tmux kill-server則把所有 session 一併帶走,而且 tmux 不會先問你。- 它不會讓機器保持醒著。整晚開著的 Mac mini,跟闔上蓋子就睡的筆電是兩回事:筆電睡著,agent 跟著暫停,真的斷電的話,session 就會整個消失。
兩分鐘就能驗證整篇。SSH 進去,跑 tmux new -s work,啟動 agent,按 Ctrl-b 再按 d,把連線整個關掉,然後跑 tmux attach -t work。畫面還是同一個,已經跑得更遠,上面有一個問題在等你回。
agent 現在能在你收起手機之後活下來。剩下一個問題:怎麼從外面連進去,又不想在路由器上對公網開任何一個 port。Tailscale 回答的是這個。