Linux tmux 一次讲明白:断线不丢会话、窗口分屏与三个常见坑
在云服务器上跑一个要半小时的任务,SSH 一断网,命令就跟着死了;第二天再登录,又得从头跑。问题不在网络,在你没用终端复用器。tmux 能把会话留在服务器上:你断开,它继续跑;你回来,它还在原地。
1. 为什么需要 tmux
没有 tmux 时,命令的生死绑在 SSH 连接上:窗口一关、网络一抖,后台任务就收到 SIGHUP 退出。tmux 在服务器上另起一个会话(session),命令跑在会话里,与你的连接解耦。手机、电脑换着登录,看到的都是同一个会话,正在跑的任务、翻过的日志都在。
2. 创建、离开与接回:三个命令
# 新建一个有名字的会话(名字比数字好认)
tmux new -s deploy
# 离开会话:先按 Ctrl-b,再按 d(detach)
# 会话留在服务器上继续跑,SSH 断了也没事
# 第二天接回
tmux attach -t deploy
# 看看服务器上都有哪些会话
tmux ls
记住这个节奏:新建 → 做事 → Ctrl-b d 离开 → attach 接回。离开不是退出,exit 才是退出——在会话里打 exit 会把会话整个关掉。
3. 窗口与分屏:一个会话当多个终端用
一个会话里可以开多个窗口(window),一个窗口里还能再分屏(pane),都是 Ctrl-b 开头:
Ctrl-b c # 新建窗口
Ctrl-b n # 下一个窗口
Ctrl-b p # 上一个窗口
Ctrl-b % # 左右分屏
Ctrl-b " # 上下分屏
Ctrl-b 方向键 # 在分屏之间移动
Ctrl-b x # 关闭当前分屏
典型用法:左边分屏跑日志 tail -f,右边分屏敲命令;或者一个窗口跑服务、一个窗口改配置,Ctrl-b n 来回切,不用开好几个 SSH 连接。
4. 坑一:把 detach 当成退出,把退出当成 detach
新手最容易混的是这两个动作:Ctrl-b d 是暂时离开,会话和里面的进程都活着;直接关掉终端窗口,效果也类似——会话还在。但在会话里输入 exit 或按 Ctrl-d,是真的结束当前 shell,窗口里的最后一个 shell 退出后,整个会话就没了,里面跑的任务也随之结束。想保住任务就只用 Ctrl-b d 离开;确认不要了再 tmux kill-session -t deploy 显式清理。
5. 坑二:翻不动历史输出
tmux 里鼠标滚轮默认不翻屏,输出一多就看不到前面的日志。按 Ctrl-b [ 进入复制模式(copy mode),就能用方向键、PageUp 翻页查看,按 q 退出;想复制一段文字,在复制模式里用空格开始选、回车确认。
如果想直接用鼠标滚轮翻屏,可以在 ~/.tmux.conf 里加一行,保存后执行 tmux source-file ~/.tmux.conf 生效:
set -g mouse on
6. 坑三:tmux 里再开 tmux,快捷键全乱了
在本地终端已经进了 tmux,又 SSH 到服务器再开一个 tmux,Ctrl-b 会被外层先截走,内层的命令发不出去。办法有两个:要么本地不用 tmux、只在服务器上用;要么给内层换个前缀键,比如在服务器的 ~/.tmux.conf 里写 set -g prefix C-a,内层就用 Ctrl-a 操作,外层仍用 Ctrl-b,互不打架。
结语
tmux 的链条很短:新建会话 → 跑任务 → Ctrl-b d 离开 → 随时 attach 接回。服务器上的长任务,从此不再怕断网。你第一次用 tmux 保住的是哪个任务?评论区聊聊。
- 点赞
- 收藏
- 关注作者
评论(0)