带着 SSH 标签页被系统杀掉,或者在后台待到连接断掉:给主机打开这个开关,Term 会自己重连,并把你原来那个复用器会话接回来。
需要 Term v26.1.0 或更高版本。
撰写于
手机不是服务器。HarmonyOS 会挂起长时间待在后台的应用,内存紧张时干脆把它结束掉,进程一旦被冻住或者结束,SSH 底下那条 TCP 连接也就跟着没了。
mosh 能扛住,因为它的会话是可以「再进去」的:服务端那一半还在跑,你的 shell 也还在它手里。SSH 没有这种东西。断掉的 SSH 连接就是断了,对面并没有一个等着你回来的会话,只有一个收到挂断信号的 shell。所以 Term 不假装能把一条 SSH 会话恢复回来,它做的是重新连上,再让主机上的终端复用器把你的活儿交还给你。
这也是为什么这个功能要配一个启动脚本,而不是一个可以单独打开的开关:真正替你把工作保住的是 tmux 或 zellij,Term 负责的是把你送回它那里。
它是按主机设置的,默认关闭;而且只有当这台主机确实用得上时,开关才会出现。
tmux new -A -s main,zellij 用户写对应的 attach 命令。
没有合格的脚本,就没有这个开关。一段只打印系统信息的脚本,或者干脆不设脚本,回来之后无处可归,所以那一行索性不出现,而不是许下一个兑现不了的承诺。只对 SSH 生效也是同一个道理:mosh 主机本来就会把会话本身接回来,telnet 则没有对应的东西可用。
# tmux:没有就新建,有就直接接上 tmux new -A -s main # zellij zellij attach -c main
强制结束、从最近任务里划掉、或者直接崩了,只要当时开着的是设了自动恢复的标签页,下次启动就会把它们重新打开。恢复过程中有一个小窗报数,完事自己关掉:跟 mosh 会话用的是同一个,因为本来就是同一次启动。
下面这一对是真机上的验证。杀之前屏幕上是 RESUME-MARKER-7317,强制结束应用,两分钟后重新打开。
RESUME-MARKER-7317,紧接着应用被强制结束。
另一半安静得多,本来就不该被你注意到。Term 在后台待到连接断掉,那个标签页就掉了;等你切回应用,它自己重连,通常一两秒就好。
这期间它不打扰你:不抢你正在看的那个标签页的焦点,也不会反复重试,只试一次,然后进入冷却。手动的「重新连接」按钮一切照旧,其余情况仍然归它管,包括没开这个开关的主机。
这套机制只回应被夺走的连接。你自己敲 exit,或者自己关掉标签页,它就关了,并且一直关着:下次启动没有任何东西要恢复。
Term 做的是重新连上并跑一遍你的启动脚本,之后你看到的一切都来自主机上的 tmux / zellij。所以脚本里要指定一个固定的会话名(tmux new -A -s main 里的 -A 就是为此),这样第二次连上是接回原来那个,而不是在旁边另起一个。
这个开关只为 tmux 和 zellij 出现。启动脚本里写 screen 不会触发它:screen 对现代全屏程序画的东西处理得不好(真彩色、斜体、复杂的 TUI 重绘都会走样),接回来的会话常常一眼看上去就是坏的,观感更像恢复失败。所以我们不再推荐它,请改用 tmux 或 zellij。
mosh 会把会话本身接回来:同一个 shell、同一个正在跑的程序,也不需要复用器,所以传输方式选 Mosh 时这个开关是隐藏的。服务器上跑得动 mosh-server,那仍然是更好的答案;这个开关是给跑不动的那些主机准备的。
相关:Mosh 会话自动恢复 · 在手机上用 tmux