SSH断线后别重跑:用tmux恢复会话的实操
SSH 连上远程服务器,正跑着一个耗时任务,网络一抖、笔记本一合盖,连接就断了。更糟的是,断线后远程命令往往跟着退出,重连后只能从头再跑。其实只要把任务放在 tmux 会话里跑,终端断开也只是“离开会话”,而不是“结束任务”。下面用一次完整实操讲清楚:怎么建会话、怎么断线重连、以及几个容易踩的坑。
一、先理解 tmux 在解决什么问题
平时 SSH 的结构是:本地终端 → SSH 连接 → 远程 Shell → 你跑的命令。SSH 一断,远程 Shell 收到挂断信号,子进程默认也会被终止。tmux 在中间多了一层:它在服务器上常驻一个会话管理器,会话里的 Shell 和命令由 tmux 托管,不依赖某一次 SSH 连接。断线时你只是 detach(脱离)了会话,会话本身还在服务器上继续跑。重连后 attach(接入)回去,就能看到原来的输出和进度。
这个思路和 nohup 不一样。nohup 适合“丢一个后台任务就不管了”,而 tmux 适合“你还会回来接着看、接着操作”的场景:编译、跑脚本、看日志、交互式调试都可以在同一个会话里继续。
二、安装与第一次建会话
大多数发行版都自带或可以直接安装:
# Ubuntu / Debian
sudo apt install tmux
# CentOS / Rocky / openEuler 等
sudo yum install tmux
# 确认版本
tmux -V
登录服务器后,新建一个有名字的会话,名字比数字好记,也方便后面恢复:
tmux new -s build
进入会话后,你会看到一个和原来几乎一样的 Shell,只是底部多了一条状态栏。这时就可以正常跑任务了,例如:
./build.sh 2>&1 | tee build.log
关键习惯是:长任务一律先开 tmux 再跑,不要等到快断线才想起来。
三、断线后恢复:两条命令就够
假设网络断了,或者你主动合上电脑。重新 SSH 登录服务器后,先列出还活着的会话:
tmux ls
典型输出是:
build: 1 windows (created Mon Nov 5 10:20:00 2026) (attached)
看到会话名后,直接接回去:
tmux attach -t build
# 简写也可以
tmux a -t build
如果你只有一个会话,连名字都不用记,tmux attach 会自动接回唯一会话。接回去后,之前的命令输出、滚动记录都在,正在跑的任务也不会因为你中途断线而重来。
四、主动离开与常用快捷键
不是每次都要等断线。需要临时离开时,按前缀键 Ctrl+b,再按 d,就能 detach:
Ctrl+b,然后按 d # detach,离开会话但不结束任务
回到会话后,常用操作也都围绕前缀键 Ctrl+b:
Ctrl+b c:新建一个窗口Ctrl+b n / p:切换到下一个 / 上一个窗口Ctrl+b %:左右分屏;Ctrl+b ":上下分屏Ctrl+b 方向键:在分屏之间移动Ctrl+b [:进入复制模式,用方向键或 PageUp 翻看历史输出,按 q 退出
记住一个原则:detach 是离开,exit 才是结束。窗口里的 Shell 输入 exit 或按 Ctrl+d,会关闭当前窗口;最后一个窗口关闭后,会话才真正结束。不要把“关掉本地终端”等同于“结束任务”,在 tmux 里,关终端只是 detach。
五、三个容易踩的坑
第一,找不到会话先别急着重建。先跑 tmux ls,确认是不是会话名打错了,或者登录到了另一台服务器。tmux 会话只存在于创建它的那台机器上,跳板机和目标机不是同一台时,恢复命令要在目标机上执行。
第二,任务输出不要只留在屏幕上。tmux 的滚动历史有限,长日志还是要重定向到文件,例如上面用的 tee build.log。这样即使会话后来被清理,也能凭日志复盘;需要长时间无人值守的任务,还可以配合 tmux ls 定期确认会话是否还在。
第三,会话不是无限期保险箱。服务器重启、管理员清理、磁盘满了都可能让会话消失。真正重要的长任务,仍要做到可断点续跑、可重复执行,tmux 解决的是“一次断线不用重来”,而不是“永远不需要重跑”。
六、一份可直接用的操作清单
- 登录后先建会话:
tmux new -s build - 在会话里跑任务,并把日志写文件
- 临时离开按
Ctrl+b d;网络断了也不要慌 - 重连后
tmux ls查看,tmux attach -t build接回 - 任务完成、确认无误后,在窗口里
exit,有序结束会话
养成“长任务先进 tmux”的习惯后,SSH 断线就从一次事故,变成一次普通的重新连接。
- 点赞
- 收藏
- 关注作者
评论(0)