‹ Term

常见问题

使用 Term 时最常遇到的问题和解决办法。

为什么切到后台,会话会断?

切走时,Term 会向系统申请一小段后台时间,最长 55 秒 —— 在这个窗口里回来,会话原封不动,快速瞥一眼别的应用不会断线。系统实际给的额度可能更短(它自己的上限约 3 分钟,低电量时约 1 分钟),而你一回到前台,Term 就立刻归还。超出窗口之后,为了省电,HarmonyOS 会挂起长时间停留在后台的应用,连接随之关闭:SSH 会话断开,里面正在运行的程序也会停止。

下面是三种保持会话的办法 —— 从最简单到最稳健。

方法一 · 保持 Term 在前台

只要 Term 在屏幕上,会话就一直是活的。把它放进悬浮窗分屏,它就算在前台 —— 你可以同时用别的应用而不掉线。

  1. 悬浮窗:从屏幕底部上滑并停顿,进入最近任务界面;点 Term 卡片上的悬浮窗图标,终端会缩成一个可拖动的小窗。
  2. 分屏:同样在最近任务界面,点 Term 卡片上的分屏图标,再选择另一个应用并排显示。
  3. 挂着会话去查资料、回消息,回来继续敲 —— 连接从未断开。
方法二 · Mosh + 复用器推荐

在服务器上运行 tmux(或 screen、zellij),最好再配合 mosh 连接。mosh 能扛住网络切换并自动重连,复用器则让程序在服务器上持续运行 —— 随时断开、随时回来,原地接着干。

  1. 在服务器上安装 tmux:sudo apt install tmux(Debian/Ubuntu)或 sudo dnf install tmux(Fedora)。
  2. 用 Term 连上主机,新建一个命名会话:tmux new -s work
  3. 在里面正常工作 —— 即使手机锁屏、切后台、断网,会话都留在服务器上。
  4. 重新连接后挂回去:tmux attach -t work,一切保持原样。
  5. 更进一步:新建主机时把连接方式选为 mosh(服务器需安装 mosh-server),漫游切换 Wi-Fi / 蜂窝也不断线。
tmux — 服务器上
# 新建命名会话
tmux new -s work

# 重连之后挂回去
tmux attach -t work
方法三 · 长任务放到后台跑

耗时任务让它脱离终端运行:在 tmux/screen 里启动,或者用 nohup … &。即使应用断连,任务也会在服务器上跑完 —— 之后重连回来检查结果即可。

nohup — 服务器上
# 脱离终端后台运行,输出写入 out.log
nohup ./long-task.sh > out.log 2>&1 &

# 重连后查看进度
tail -f out.log
在手机上怎么用 tmux?

开一个命名会话,Term 会认出前台跑的是 tmux,把软键盘上方的按键栏换成一套 tmux 专用键 —— esc、^B 前缀、四个方向键,以及一批一按就发出去的前缀组合。识别靠的是 Shell 集成上报的命令(默认开启),所以别把它关掉。

  1. 连上主机,新建命名会话:tmux new -s work
  2. 按键栏随即换成 tmux 键集:^B[ 进入复制模式(回看历史就靠它)、^Bz 放大当前窗格、^B%^B" 分屏、^Bc 新建窗口、^Bn / ^Bp 切换下一个 / 上一个窗口、^Bw 窗口列表、^Bd 脱离;^C^R 也在,毕竟底下还是个 shell 提示符。
  3. 这一套是内置的,跟着前台程序自动切换 —— 不需要你配置什么。需要别的控制键时,点一下按键栏最左边的 ctrl:它会为下一个按键挂上 Ctrl 修饰(altshift 同理)。
  4. 离开时按 ^Bd 脱离 —— 会话和里面正在跑的程序都留在服务器上。
  5. 下次连上来 tmux attach -t work 挂回去,一切保持原样。
一个 tmux 会话上下分成两个窗格:上面运行 htop,下面是 tail 打出的日志;最底部是 tmux 自己的状态栏。
tmux 分屏 —— 上下两个窗格:htop 和 tail -12 ~/logs/app.log;最下面那条深色行是 tmux 自己的状态栏,左边是会话名 work,中间是窗口 1:bash*,右边是时钟。顶部导航栏写着的 tmux new -s work 就是 Shell 集成上报的命令 —— 按键栏正是据此切到 tmux 键集的。
终端里的两行:tmux 打出的 [detached (from session work)],下一行是已经输入 tmux attach -t work 的提示符。
脱离,再挂回去 —— 按下 ^Bd 之后,tmux 打出 [detached (from session work)] 并把 shell 还给你;下一行的 tmux attach -t work 会把整个会话原样接回来。
怎么用 mosh 连接?

先在服务器上装好 mosh —— Term 要的是 mosh-server 这个程序。然后编辑主机,把连接方式选成 Mosh;应用里那行提示已经把话说清楚了:登录仍然走 SSH,之后才把会话交给 UDP。所以服务器一侧还要放行 UDP 60000–61000;如果只开放了少数几个 UDP 端口,也可以在主机编辑页把 mosh 钉在这几个端口上。连上之后,切换 Wi-Fi / 蜂窝、信号中断都不会掉线,会话会自己重连 —— 上面那条后台挂起的规矩,对 mosh 不适用。

  1. 在服务器上安装:sudo apt install mosh(Debian/Ubuntu)或 sudo dnf install mosh(Fedora)。
  2. 在 Term 里编辑这台主机 → 连接方式 → 选 Mosh。主机、端口、用户名照旧填 SSH 那一套,登录本来就还是走 SSH。
  3. 放行服务器(以及中间链路)上的 UDP 60000–61000 —— 不特别指定的话,mosh 会在这个范围里自己挑一个端口。只放行了特定端口的话,就在连接方式里的「UDP 端口或范围(可选)」填上:单个端口(60000)或一段范围(60000:61000);留空就是自动挑。
  4. 想确认真的走在 mosh 上:连上后跑 ps -o args= -p $PPID,shell 的父进程应该是 mosh-server,而不是 sshd
主机编辑页的「连接方式」卡片,分段控件 SSH / Mosh / Telnet 中 Mosh 处于选中状态。
连接方式 · Mosh —— 主机编辑页里的分段控件(SSH / Mosh / Telnet),选中 Mosh。上面「服务器」卡片里的主机、端口、用户名照旧是 SSH 那一套。下面那行是应用自己的提示:主机需要装 mosh-server,登录仍通过 SSH 完成。
mosh — 服务器上
# 安装 mosh —— Term 要的是里面的 mosh-server
sudo apt install mosh
sudo dnf install mosh

# 确认 shell 的父进程真的是 mosh-server
ps -o args= -p $PPID
一个 mosh 会话里,ps -o args= -p $PPID 的输出是 mosh-server new -s -c 256 -l LANG=en_US.UTF-8。
确认走的是 mosh —— ps -o args= -p $PPID 回答的是 mosh-server new -s -c 256 …:shell 的父进程是 mosh-server,不是 sshd,会话确实跑在 UDP 上。顶部导航栏也写着 Sandbox (mosh)

想再深一步:Mosh 进阶设置 —— 端口、会话超时、初始化脚本

mosh 会话为什么不能回滚?

因为 mosh 是直接重绘屏幕,而不是逐行传输 —— 根本没有历史可以给 Term 翻。这是 mosh 的设计,不是 Term 的限制。想回看,就在服务器上跑 tmux(或 screen、zellij),用它自己的回滚:在 tmux 里就是复制模式,也就是按键栏上的 ^B[(见上面 tmux 那一节)。应用里也会在原地说同一件事 —— 首次连上 mosh 时的提示卡,以及在 mosh 会话里第一次上滑时弹出的提示。

关闭 mosh 标签页会结束会话吗?

会。关闭 mosh 标签页时,Term 会发出 mosh 的关闭数据包,结束服务器上的那个会话;万一这些包没能送到,它还会再用 SSH 连回去,把遗留的 mosh-server 收掉 —— 基本不会在主机上留下孤儿进程。想稍后回来,就别关标签页。如果这份工作必须活得比标签页更久,那正是 tmux 的用处:在 mosh 会话里跑 tmux,关掉标签页也只是脱离而已。

「mosh-server 未启动」/「UDP 会话未能建立」

mosh 先用 SSH 登录,再把会话交给 UDP —— 这两条报错分别对应其中一段出了问题,Term 会直接告诉你是哪一段。失败画面下方保留着原始错误和它的 E_ 代码(提 bug 时用得上),并给出编辑主机重试两个按钮。

  1. 已连接,但 mosh-server 未启动。 登录那一步是成功的,缺的是程序本身 —— 在服务器上装 mosh,或者把这台主机改回 SSH。
  2. 已通过 SSH 连接,但 mosh 的 UDP 会话未能建立。 mosh-server 起来了,数据包却没到 —— 放行服务器以及中间链路上的 UDP 60000–61000
tmux 里能显示内联图片吗?

能,但 tmux.conf 里要加两行。Term 原生解码 sixel、kitty 图形协议和 iTerm2 的 imgcat(OSC 1337)—— PNG、JPEG 以及 GIF 的第一帧 —— 并把图像合成在文字下层。要穿过 tmux,图像走的是 kitty 的 Unicode 占位符方案:图像 id 藏在单元格的真彩色前景色里。所以 tmux 一要放行这段转义序列,二要在内部保持真彩色 —— 少了第二条,tmux 会把带 id 的颜色降到 256 色,id 被改坏,图也就废了。这两行都需要 tmux 3.3a 或更新的版本 —— 版本太旧的话,tmux 启动时只会报 “unknown option”,图片则悄无声息地不出来。

~/.tmux.conf
# 放行图像的转义序列
set -g allow-passthrough on

# 在 tmux 内保持真彩色,否则图像 id 会被改坏
set -as terminal-features ",*:RGB"
备注与参考

mosh 会话不受影响 —— 它天然能在后台存活并自动重连,所以后台警告对它不适用。应用内也有同样的说明:主机页面的后台会话警告横幅 → 点开「保持会话在线」帮助页。

参考: mosh.org · tmux 入门 · zellij · GNU screen · nohup(1)