‹ 指南

Mosh 工作階段自動恢復 v26.0.22+

被系統結束、被滑掉、當掉、手機重新開機:下次打開 Term,mosh 工作階段自己接回來。

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

撰寫於 · 更新於

被結束的是哪一半

手機不是伺服器。為了省電,HarmonyOS 會暫停長時間留在背景的應用;記憶體吃緊時索性把它結束掉。你自己從最近任務裡滑掉、應用當掉、手機重新開機,結果都一樣:行程沒了。

但對 mosh 來說,沒了的只是客戶端那一半。主機上的 mosh-server 還在執行,你的 shell、正在跑的程式、目前目錄、剛 export 的環境變數,全都原封不動留在那裡,只是再沒有誰知道怎麼連回去。以往這就是一次真正的損失:重新登入、重新 cd、重新跑一遍,主機上還多留下一個沒人認領的 mosh-server。

現在它自己回來

帶著還活著的 mosh 工作階段被結束,下次打開 Term,它會自己把這些工作階段接回來:不重新走一次 SSH 登入,也不另起一個 mosh-server,接回來的就是原本那個 shell。在伺服器那一端看來,這跟你從 Wi-Fi 切到行動網絡沒有兩樣,而這本來就是 mosh 最擅長的事。

下面兩張是真機上的驗證。結束之前先在工作階段裡 export MARK=resume_proof_77,新開的 shell 不可能有這個變數。強制結束應用、重新打開、再跑一次 env | grep MARK,它還在。同一個 shell,不是悄悄重連了一次。

結束之前 · 11:24 一個名為 Sandbox (mosh) 的工作階段:export MARK=resume_proof_77 之後,env | grep MARK 印出 MARK=resume_proof_77。狀態列時間 11:24。
結束之前:工作階段裡設了 MARK=resume_proof_77,env | grep MARK 認得它。緊接著應用被強制結束。
恢復之後 · 11:27 同一個工作階段在應用重啟之後:整屏歷史原樣保留,末尾又跑了一次 env | grep MARK,同樣印出 MARK=resume_proof_77。狀態列時間 11:27。
恢復之後:三分鐘後重新打開應用,整屏重繪,上面的歷史一行不少;再跑一次 env | grep MARK,resume_proof_77 還在。同一個 shell,同一個行程。

恢復的那幾秒

啟動時若有可以恢復的工作階段,Term 會先彈一個小視窗:應用自己的轉圈圖示,加上「正在恢復 N 個工作階段…」,下面是「已完成 / 總數」的計數。多個工作階段一起接,不必一個個排隊。全部接上就直接關掉,你落回原本的分頁。

主機列表上方的模態小視窗:轉圈圖示、Resuming 1 session… 和 0 / 1 的計數。
啟動時:恢復過程中的小視窗,背後的介面照常顯示。它自己會關,不用點。
主機列表:Sandbox (mosh) 那一列帶著 MOSH 標記和一個綠色圓點。
接上之後,主機列表裡那台 mosh 主機重新亮起綠點:工作階段是活的,分頁也回來了。

如果伺服器已經不在了

能不能接回來,並沒有保證:主機重新開機過、有人手動收掉了 mosh-server,或者它已經超過「Mosh 工作階段逾時」自己結束了。

這種時候 Term 會試大約 5 秒,然後把結果寫在同一個小視窗上(N 個已恢復 · M 個無法連線),停一下再關。它只問這一次:接不上的工作階段,下次啟動不會再提起。

主機上那個 mosh-server 到底願意等多久,由「設定 → 終端機 → Mosh 工作階段逾時」決定:1 天到 1 個月,預設 1 週,也可以選永不。等得越久,隔了很長時間再打開也越有可能接得回來;共用的主機上則短一點更乾淨。

同一個小視窗,計數那一行顯示 0 resumed · 1 unreachable。
對面沒了:試了大約五秒之後,小視窗直接給出結果,停一下自己關掉。這個工作階段不會再被提起。

相關:Mosh 進階設定:連接埠、工作階段逾時、初始化指令碼

幾點說明

正常關分頁不會留下東西

這套機制只在應用「非正常結束」時才起作用。你自己關掉 mosh 分頁時,Term 照舊會去結束伺服器上那個工作階段,必要時再用 SSH 連回去把殘留行程收掉:主機上不會因此累積孤兒 mosh-server,下次啟動也沒有任何東西要恢復。

這些資料不會離開這部手機

Term 重新接回來所需要的東西,只存在於你手機本機,不上雲、不同步、不經過任何第三方。它跟你的主機和私鑰放在同一個地方,受同樣的保護:靜態加密,而且手機開機之後沒有解鎖過,就連讀都讀不出來。工作階段一結束,這條記錄立刻刪除。

接回來的是畫面,不是歷史

這一點跟平常的 mosh 一樣:mosh 傳的是目前這一屏,不是逐行的位元組串流,所以恢復之後能回捲的歷史仍然只有 mosh 工作階段本來就有的那些。要真正的回看,還是在伺服器上跑 tmux,而且 tmux new -A -s main 配上 mosh 初始化指令碼,本來就是最省心的組合。