‹ 指南

SSH 断了也能自动恢复吗? v26.1.0+

带着 SSH 标签页被系统杀掉,或者在后台待到连接断掉:给主机打开这个开关,Term 会自己重连,并把你原来那个复用器会话接回来。

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

撰写于

为什么 SSH 需要这一步

手机不是服务器。HarmonyOS 会挂起长时间待在后台的应用,内存紧张时干脆把它结束掉,进程一旦被冻住或者结束,SSH 底下那条 TCP 连接也就跟着没了。

mosh 能扛住,因为它的会话是可以「再进去」的:服务端那一半还在跑,你的 shell 也还在它手里。SSH 没有这种东西。断掉的 SSH 连接就是断了,对面并没有一个等着你回来的会话,只有一个收到挂断信号的 shell。所以 Term 不假装能把一条 SSH 会话恢复回来,它做的是重新连上,再让主机上的终端复用器把你的活儿交还给你。

这也是为什么这个功能要配一个启动脚本,而不是一个可以单独打开的开关:真正替你把工作保住的是 tmux 或 zellij,Term 负责的是把你送回它那里。

怎么打开

它是按主机设置的,默认关闭;而且只有当这台主机确实用得上时,开关才会出现。

  1. 打开「编辑主机」,展开「高级选项」。
  2. 把「启动脚本」设成一段会接上复用器的命令:tmux 用户一般写 tmux new -A -s main,zellij 用户写对应的 attach 命令。
  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 就是为此),这样第二次连上是接回原来那个,而不是在旁边另起一个。

只支持 tmux 和 zellij

这个开关只为 tmux 和 zellij 出现。启动脚本里写 screen 不会触发它:screen 对现代全屏程序画的东西处理得不好(真彩色、斜体、复杂的 TUI 重绘都会走样),接回来的会话常常一眼看上去就是坏的,观感更像恢复失败。所以我们不再推荐它,请改用 tmux 或 zellij。

mosh 主机不需要这个

mosh 会把会话本身接回来:同一个 shell、同一个正在跑的程序,也不需要复用器,所以传输方式选 Mosh 时这个开关是隐藏的。服务器上跑得动 mosh-server,那仍然是更好的答案;这个开关是给跑不动的那些主机准备的。

相关:Mosh 会话自动恢复 · 在手机上用 tmux