tmux 入门:SSH 断线也不丢的终端会话
tmux 入门:SSH 断线也不丢的终端会话
先说一个常见翻车现场
用 SSH 连上服务器跑一个耗时任务——导数据、训练模型、批量转码——跑到一半,本地网络抖了一下,终端窗口一关,任务跟着没了。重连上去一看,进程早已退出,只能从头再跑。更糟的是,有时任务其实还在跑,却因为终端断了,既看不到输出,也没法正常收尾,只能凭感觉去猜、去杀进程。
问题的根不在任务本身,而在会话的归属:普通 SSH 会话把程序绑在当前终端上,终端一断,程序就收到挂断信号。tmux 解决的正是这一点:它在服务器上建一个独立于终端的会话,程序跑在会话里,终端只是“看”会话的一扇窗。窗关了,会话和程序都不受影响。
安装与第一个会话
大多数发行版一行命令就能装好:
# Ubuntu / Debian
sudo apt install tmux
# CentOS / RHEL
sudo yum install tmux
装好后,在服务器上输入 tmux 就进入一个新会话。看起来和普通终端没什么两样,只是最下方多了一条状态栏,显示会话名、窗口和时间。这时跑一个耗时命令,比如:
python train.py
然后按下 Ctrl+b 再按 d(detach,分离),你就回到了原来的终端,而训练仍在会话里继续跑。哪怕这时把 SSH 关掉、电脑合盖,服务器上的会话也不会停。
断线重连:会话还在原地等你
重新 SSH 登录后,一条命令就能回到原来的会话:
tmux attach
如果有多个会话,先列出来再挑:
tmux ls
tmux attach -t 0
tmux ls 会显示每个会话的名字和窗口数,attach -t 0 就是连到编号为 0 的那个。回到会话里,之前的输出、正在跑的程序都原样在场,就像从没断过线一样。这就是 tmux 最核心的价值:把“人在线”与“程序运行”解耦。
窗口与分屏:一个终端当几个用
一个会话里可以开多个窗口和分屏,不用来回开好几个 SSH 连接:
- 新建窗口:
Ctrl+b再按c - 切换窗口:
Ctrl+b再按n(下一个)或p(上一个) - 左右分屏:
Ctrl+b再按% - 上下分屏:
Ctrl+b再按" - 在分屏间移动:
Ctrl+b再按方向键
一个常见搭配是:左边窗口跑服务日志,右边窗口敲命令查问题;或者一个窗口跑训练、另一个窗口看 GPU 占用。窗口和分屏都属于同一个会话,断线重连后布局也都在。
几个值得养成的好习惯
第一,给会话起个有意义的名字,而不是用默认编号:
tmux new -s train
tmux attach -t train
这样 tmux ls 里一眼就能认出哪个是训练、哪个是数据处理。
第二,长时间任务开始前先确认自己在 tmux 里。一个简单的自查方法是看终端底部有没有 tmux 的状态栏;没有的话,先 tmux 再启动任务,成本只有一秒,省下的可能是几小时的重跑。
第三,任务跑完记得清理。exit 退出会话里的 Shell,或者用 tmux kill-session -t train 删掉不再需要的会话,避免服务器上堆满无人认领的旧会话。
小结
tmux 并不复杂,日常高频操作其实只有三条:tmux 建会话、Ctrl+b d 分离、tmux attach 回来。但它改变了一个关键假设:程序的生命周期不再跟着你的终端走。学会这一招之后,远程跑长任务就不再是一场“千万别断网”的赌博——断线了,重连回来,任务还在原地等你。
- 点赞
- 收藏
- 关注作者
评论(0)