使用 Term 时最常遇到的问题和解决办法。
切走时,Term 会向系统申请一小段后台时间,最长 55 秒 —— 在这个窗口里回来,会话原封不动,快速瞥一眼别的应用不会断线。系统实际给的额度可能更短(它自己的上限约 3 分钟,低电量时约 1 分钟),而你一回到前台,Term 就立刻归还。超出窗口之后,为了省电,HarmonyOS 会挂起长时间停留在后台的应用,连接随之关闭:SSH 会话断开,里面正在运行的程序也会停止。
下面是三种保持会话的办法 —— 从最简单到最稳健。
只要 Term 在屏幕上,会话就一直是活的。把它放进悬浮窗或分屏,它就算在前台 —— 你可以同时用别的应用而不掉线。
在服务器上运行 tmux(或 screen、zellij),最好再配合 mosh 连接。mosh 能扛住网络切换并自动重连,复用器则让程序在服务器上持续运行 —— 随时断开、随时回来,原地接着干。
sudo apt install tmux(Debian/Ubuntu)或 sudo dnf install tmux(Fedora)。tmux new -s work。tmux attach -t work,一切保持原样。mosh-server),漫游切换 Wi-Fi / 蜂窝也不断线。# 新建命名会话 tmux new -s work # 重连之后挂回去 tmux attach -t work
耗时任务让它脱离终端运行:在 tmux/screen 里启动,或者用 nohup … &。即使应用断连,任务也会在服务器上跑完 —— 之后重连回来检查结果即可。
# 脱离终端后台运行,输出写入 out.log nohup ./long-task.sh > out.log 2>&1 & # 重连后查看进度 tail -f out.log
开一个命名会话,Term 会认出前台跑的是 tmux,把软键盘上方的按键栏换成一套 tmux 专用键 —— esc、^B 前缀、四个方向键,以及一批一按就发出去的前缀组合。识别靠的是 Shell 集成上报的命令(默认开启),所以别把它关掉。
tmux new -s work。^B[ 进入复制模式(回看历史就靠它)、^Bz 放大当前窗格、^B% 与 ^B" 分屏、^Bc 新建窗口、^Bn / ^Bp 切换下一个 / 上一个窗口、^Bw 窗口列表、^Bd 脱离;^C 和 ^R 也在,毕竟底下还是个 shell 提示符。ctrl:它会为下一个按键挂上 Ctrl 修饰(alt、shift 同理)。^Bd 脱离 —— 会话和里面正在跑的程序都留在服务器上。tmux attach -t work 挂回去,一切保持原样。
tail -12 ~/logs/app.log;最下面那条深色行是 tmux 自己的状态栏,左边是会话名 work,中间是窗口 1:bash*,右边是时钟。顶部导航栏写着的 tmux new -s work 就是 Shell 集成上报的命令 —— 按键栏正是据此切到 tmux 键集的。
^Bd 之后,tmux 打出 [detached (from session work)] 并把 shell 还给你;下一行的 tmux attach -t work 会把整个会话原样接回来。先在服务器上装好 mosh —— Term 要的是 mosh-server 这个程序。然后编辑主机,把连接方式选成 Mosh;应用里那行提示已经把话说清楚了:登录仍然走 SSH,之后才把会话交给 UDP。所以服务器一侧还要放行 UDP 60000–61000;如果只开放了少数几个 UDP 端口,也可以在主机编辑页把 mosh 钉在这几个端口上。连上之后,切换 Wi-Fi / 蜂窝、信号中断都不会掉线,会话会自己重连 —— 上面那条后台挂起的规矩,对 mosh 不适用。
sudo apt install mosh(Debian/Ubuntu)或 sudo dnf install mosh(Fedora)。UDP 60000–61000 —— 不特别指定的话,mosh 会在这个范围里自己挑一个端口。只放行了特定端口的话,就在连接方式里的「UDP 端口或范围(可选)」填上:单个端口(60000)或一段范围(60000:61000);留空就是自动挑。ps -o args= -p $PPID,shell 的父进程应该是 mosh-server,而不是 sshd。
# 安装 mosh —— Term 要的是里面的 mosh-server sudo apt install mosh sudo dnf install mosh # 确认 shell 的父进程真的是 mosh-server ps -o args= -p $PPID
ps -o args= -p $PPID 回答的是 mosh-server new -s -c 256 …:shell 的父进程是 mosh-server,不是 sshd,会话确实跑在 UDP 上。顶部导航栏也写着 Sandbox (mosh)。因为 mosh 是直接重绘屏幕,而不是逐行传输 —— 根本没有历史可以给 Term 翻。这是 mosh 的设计,不是 Term 的限制。想回看,就在服务器上跑 tmux(或 screen、zellij),用它自己的回滚:在 tmux 里就是复制模式,也就是按键栏上的 ^B[(见上面 tmux 那一节)。应用里也会在原地说同一件事 —— 首次连上 mosh 时的提示卡,以及在 mosh 会话里第一次上滑时弹出的提示。
会。关闭 mosh 标签页时,Term 会发出 mosh 的关闭数据包,结束服务器上的那个会话;万一这些包没能送到,它还会再用 SSH 连回去,把遗留的 mosh-server 收掉 —— 基本不会在主机上留下孤儿进程。想稍后回来,就别关标签页。如果这份工作必须活得比标签页更久,那正是 tmux 的用处:在 mosh 会话里跑 tmux,关掉标签页也只是脱离而已。
mosh 先用 SSH 登录,再把会话交给 UDP —— 这两条报错分别对应其中一段出了问题,Term 会直接告诉你是哪一段。失败画面下方保留着原始错误和它的 E_ 代码(提 bug 时用得上),并给出编辑主机和重试两个按钮。
UDP 60000–61000。能,但 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”,图片则悄无声息地不出来。
# 放行图像的转义序列 set -g allow-passthrough on # 在 tmux 内保持真彩色,否则图像 id 会被改坏 set -as terminal-features ",*:RGB"
mosh 会话不受影响 —— 它天然能在后台存活并自动重连,所以后台警告对它不适用。应用内也有同样的说明:主机页面的后台会话警告横幅 → 点开「保持会话在线」帮助页。
参考: mosh.org · tmux 入门 · zellij · GNU screen · nohup(1)