‹ 指南

SSH 工作階段自動恢復 v26.1.0+

帶著 SSH 分頁被系統結束,或者在背景待到連線中斷:給主機打開這個開關,Term 會自己重連,並把你原本那個多工器工作階段接回來。

需要 Term v26.1.0 或更新版本。

撰寫於

為甚麼 SSH 需要這一步

手機不是伺服器。HarmonyOS 會暫停長時間留在背景的應用,記憶體吃緊時索性把它結束掉,行程一旦被凍住或者結束,SSH 底下那條 TCP 連線也就跟著沒了。

mosh 扛得住這一下,因為 mosh 的工作階段是可以「重新進去」的:伺服端那一半還在執行,你的 shell 也還在它手裡。SSH 沒有這種東西。斷掉的 SSH 連線就是斷了,對面並沒有一個等著你回來的工作階段,只有一個收到掛斷訊號的 shell。所以 Term 不假裝能把一條 SSH 工作階段恢復回來,它做的是重新連上,再讓主機上的終端多工器把你的工作交還給你。

這也是為甚麼它不是一個可以單獨打開的開關:真正替你把工作保住的是 tmux 或 zellij,Term 負責的是把你送回它那裡。

怎麼打開

它是按主機設定的,預設關閉;而且只有當這台主機確實用得上時,開關才會出現。

  1. 打開「編輯主機」,展開「進階選項」。
  2. 把「啟動腳本」設成一段會接上多工器的指令:一般就是 tmux new -A -s main。
  3. 腳本那一欄下面會多出「自動恢復工作階段」開關,打開它,儲存。
主機編輯頁的進階選項:啟動腳本是 System info,跳板主機下面直接就是標籤,沒有自動恢復那一列。
不接多工器的腳本:「自動恢復工作階段」這一列根本不出現。
同一處設定,啟動腳本改成 attach tmux 之後,跳板主機下面多了一個「自動恢復工作階段」開關和一段說明。
接上 tmux 的腳本,開關出現在它正下方,預設是關的。下面那段說明就是它的全部承諾:隨應用被結束的分頁下次啟動重新開啟,在背景斷線的分頁回到前台時自動重連。

沒有合格的腳本,就沒有這個開關。一段只印出系統資訊的腳本,或者乾脆不設腳本,回來之後無處可歸,所以那一列索性不出現,而不是許下一個兌現不了的承諾。只對 SSH 生效也是同一個道理:mosh 主機本來就會把工作階段本身接回來,telnet 則沒有對應的東西可用。

合格的啟動腳本
# tmux:沒有就新建,有就直接接上
tmux new -A -s main

# zellij
zellij attach -c main
應用被結束之後

強制結束、從最近任務裡滑掉、或者直接當掉,只要當時開著的是設了自動恢復的分頁,下次啟動就會把它們重新開啟。恢復過程中有一個小視窗報數,完事自己關掉:跟 mosh 工作階段用的是同一個,因為本來就是同一次啟動。

主機清單上方的小視窗:正在恢復 1 個工作階段…,下面是 0 / 1 的計數。
啟動時:一個分頁要接回來。背後的清單照常顯示,小視窗自己會關。

下面這一對是真機上的驗證。結束之前螢幕上是 RESUME-MARKER-7317,強制結束應用,兩分鐘後重新打開。

強制結束之前 · 10:31 標題為 tmux new -A -s term 的工作階段,螢幕上是 echo RESUME-MARKER-7317 和它的輸出,狀態列時間 10:31。
結束之前:tmux 工作階段裡印出了 RESUME-MARKER-7317,緊接著應用被強制結束。
重新打開之後 · 10:33 同一個分頁在應用重新啟動之後:同樣的兩行,同樣的提示符,狀態列時間 10:33。
回來之後:兩分鐘後重新打開,分頁自己連上,啟動腳本接回同一個 tmux 工作階段,上面的歷史一行不少。甚麼都沒有重跑。
從背景回來的時候

另一半安靜得多,本來就不該被你注意到。Term 在背景待到連線中斷,那個分頁就掉了;等你切回應用,它自己重連,通常一兩秒就好。

這期間它不打擾你:不搶你正在看的那個分頁的焦點,也不會反覆重試,只試一次,然後進入冷卻。手動的「重新連線」按鈕一切照舊,其餘情況仍然歸它管,包括沒開這個開關的主機。

幾點說明

自己登出的,不會被拉回來

這套機制只回應被奪走的連線。你自己敲 exit,或者自己關掉分頁,它就關了,並且一直關著:下次啟動沒有任何東西要恢復。

接回來的是連線,不是終端

Term 做的是重新連上並跑一遍你的啟動腳本,之後你看到的一切都來自主機上的 tmux / zellij。所以腳本裡要指定一個固定的工作階段名稱(tmux new -A -s main 裡的 -A 就是為此),這樣第二次連上是接回原本那個,而不是在旁邊另起一個。

GNU screen 不支援

啟動腳本裡寫 screen 不會讓開關出現,這是刻意的。screen 對現代全螢幕程式畫的東西處理得不好(真彩色、斜體、複雜的 TUI 重繪都會走樣),接回來的工作階段常常一眼看上去就是壞的,觀感更像恢復失敗,而不是 screen 的限制。請改用 tmux 或 zellij。

mosh 主機不需要這個

mosh 會把工作階段本身接回來:同一個 shell、同一個正在跑的程式,也不需要多工器,所以傳輸方式選 Mosh 時這個開關是隱藏的。伺服器上跑得動 mosh-server,那仍然是更好的答案;這個開關是給跑不動的那些主機準備的。

相關:Mosh 工作階段自動恢復 · 在手機上用 tmux