开发工具

tmux 会话管理与复用:SSH 断开也不中断的远程开发

SSH 一断,跑了一半的编译、正在编辑的代码以及十几个窗口全部前功尽弃。本文教你用 tmux 的命名会话、分离/复用、窗口与窗格划分,做到断网重连后一切原样继续。

作者:巧匠团队·6 分钟阅读·更新于 2026-09-06

为什么说 tmux 是远程开发的"续命开关"

终端进程属于创建它的 SSH 会话,连接一断,前台运行的任务(正在下载、正在编译、npm run dev)都会收到挂断信号被终止。tmux 是一个终端复用器,它让你在服务器上启动一个常驻的会话,SSH 只是"附着"到这个会话之上,断开连接会话依然在后台存活。

因此你可以在本地断网、合上笔记本甚至换个网络环境,回到电脑后再 attach 上去,看到的一切和离开时一模一样。用熟之后它会成为你的远程服务器、多机排障、长任务执行的标准姿势。

# 新会话 + 命名,方便后续按名复用
tmux new -s blog-dev
# 分离(不退出,后台保留),快捷键:Ctrl-b 然后 d
# 会话列表
 tmux ls

命名会话:一条命令重连到对应任务

每个复杂任务开一个命名会话是组织远程工作的关键。编译任务、数据库调试、日志尾随各占一个会话,而不是全都堆在无名的默认会话里,不然时间一长根本分不清哪个是哪个。

命名后可以通过 tmux attach -t 名字 重新进入。a -t 多重连时用 tmux attach -t blog-dev;要在不切换到目标会话的情况下向里面的窗口发命令,用 send-keys -t。会话还可以 ping 一下看是否在线(has-session),在脚本里用它能写出"没有就新建、有就复用"的自动化入口脚本。

# 新建并命名
tmux new -s web
# 在分离状态下重连
tmux attach -t web
# 不切换也往某会话发送命令
tmux send-keys -t web "tail -f /var/log/app.log" Enter
# 脚本探测:没有则创建,有则复用
tmux has-session -t dev 2>/dev/null || tmux new -s dev -d; tmux attach -t dev

窗口与窗格:一个会话里放下调度、日志、编辑器

一个会话能包含多个窗口,每个窗口又能切成多个窗格。常见的布局是:一个窗格跑应用,一个窗格实时看日志,一个窗格开 vim 改代码。这样在单屏上完成"改-跑-看"循环,省去反复切换。

常用命令与快捷键:Ctrl-b c 新建窗口、Ctrl-b n/p 切换、Ctrl-b % 左右分屏、Ctrl-b " 上下分屏、Ctrl-b 方向键 在窗格间移动。窗格布局可以用 select-layout 一键复位为预设(even-horizontal 均分等),也可以用 Ctrl-b 空格 循环几种默认布局。

如果追求省心,把常用布局存成别名:在 tmux.conf 里 bind-key 重新映射一套命令,比如用 ' 直接切换布局。

bind-key '  select-layout even-horizontal   # 快速均分当前窗格
bind-key s  swap-pane -U                     # 上下交换当前窗格
# ~/.tmux.conf 加载后:source-file ~/.tmux.conf

持久重启与断点恢复:让服务跑在 tmux 里

很多运维把服务直接扔在 SSH 前台,结果一断连服务就停。正确做法是让命令跑在 tmux 里:后台新建会话、在里面执行启动命令,再分离,这样服务作为 tmux 会话的成员在后台常驻,与是否有人 SSH 无关。

配合开机自启或 systemd,可以把这套固化成"服务器重启后自动拉起"的服务编排。若希望进程在无人会话时也不被回收,务必给会话一个名字并避免 kill-session,同时确认 tmux 的 detach 行为(默认 detach 不结束会话)。恢复时先 tmux ls 看会话还在不在,若在直接 attach,若其内部进程崩溃则在会话内重跑启动命令。

# 后台启动一个常驻服务会话并分离
tmux new -s svc -d "cd /app && ./server 2>&1 | tee /tmp/server.log"
# 稍后从任意终端复用查看
tmux attach -t svc
# 查看会话及其窗口状态
 tmux ls

验证断线重连与复制粘贴链路

配置完要真实验证:开启一个命名会话、在里面跑一个长命令(比如 sleep 或 tail),然后 Ctrl-b d 分离并直接关闭 SSH。重连 SSH 后 tmux attach -t 会话名,长命令应还在继续而未中断。

复制粘贴在 tmux 里的坑很多人踩过:默认鼠标滚动是浏览模式,复制要按住 Shift 拖动或进入 copy-mode。若要开启鼠标支持,在 ~/.tmux.conf 里 set -g mouse on,这样选中即复制、滚轮翻历史,脱离 SSH 时也能方便地搬文本。

tmux new -s test
echo "start"; sleep 60; echo "done"   # 在会话内执行后 Ctrl-b d 离开
# 关掉 SSH,重连后仍在执行
tmux attach -t test
# ~/.tmux.conf
set -g mouse on

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。