被系統結束、被滑掉、當掉、手機重新開機:下次打開 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,不是悄悄重連了一次。
MARK=resume_proof_77,env | grep MARK 認得它。緊接著應用被強制結束。
env | grep MARK,resume_proof_77 還在。同一個 shell,同一個行程。啟動時若有可以恢復的工作階段,Term 會先彈一個小視窗:應用自己的轉圈圖示,加上「正在恢復 N 個工作階段…」,下面是「已完成 / 總數」的計數。多個工作階段一起接,不必一個個排隊。全部接上就直接關掉,你落回原本的分頁。
能不能接回來,並沒有保證:主機重新開機過、有人手動收掉了 mosh-server,或者它已經超過「Mosh 工作階段逾時」自己結束了。
這種時候 Term 會試大約 5 秒,然後把結果寫在同一個小視窗上(N 個已恢復 · M 個無法連線),停一下再關。它只問這一次:接不上的工作階段,下次啟動不會再提起。
主機上那個 mosh-server 到底願意等多久,由「設定 → 終端機 → Mosh 工作階段逾時」決定:1 天到 1 個月,預設 1 週,也可以選永不。等得越久,隔了很長時間再打開也越有可能接得回來;共用的主機上則短一點更乾淨。
這套機制只在應用「非正常結束」時才起作用。你自己關掉 mosh 分頁時,Term 照舊會去結束伺服器上那個工作階段,必要時再用 SSH 連回去把殘留行程收掉:主機上不會因此累積孤兒 mosh-server,下次啟動也沒有任何東西要恢復。
Term 重新接回來所需要的東西,只存在於你手機本機,不上雲、不同步、不經過任何第三方。它跟你的主機和私鑰放在同一個地方,受同樣的保護:靜態加密,而且手機開機之後沒有解鎖過,就連讀都讀不出來。工作階段一結束,這條記錄立刻刪除。
這一點跟平常的 mosh 一樣:mosh 傳的是目前這一屏,不是逐行的位元組串流,所以恢復之後能回捲的歷史仍然只有 mosh 工作階段本來就有的那些。要真正的回看,還是在伺服器上跑 tmux,而且 tmux new -A -s main 配上 mosh 初始化指令碼,本來就是最省心的組合。