tmux 使用笔记:断线不丢会话的效率工具

在服务器上跑长任务,最怕的就是 SSH 断线——进程跟着没了,几小时的白等。tmux 解决这个问题,顺便把「一个终端开多个窗口」这件事也做了。

一、为什么需要它

bash
# 没有 tmux 的痛苦:
ssh server
./long-task.sh      # 跑了 2 小时
# 网络一抖 → 断线 → SIGHUP → 进程终止 → 白跑

# 有 tmux:
ssh server
tmux new -s work
./long-task.sh
# 断线?没关系,任务还在跑
ssh server
tmux a -t work      # 回到原来的会话,进度清清楚楚

核心机制:tmux 是跑在服务器上的独立进程,终端只是「窗口」。窗口关了,进程还在。

二、三个层级

理解这个层级关系,剩下的就是记快捷键:

bash
Session(会话)  ── 一个独立的工作环境,可以脱离/重连
  └─ Window(窗口) ── 类似浏览器标签页
      └─ Pane(面板) ── 一个窗口里横向/纵向分出来的小格
概念类比常用场景
Session一个项目的工作区每个项目一个
Window标签页编辑 / 看日志 / 跑测试
Pane分屏左边编辑,右边看日志

三、必记的快捷键

所有快捷键都要先按前缀键,默认是 Ctrl+b(记作 C-b),按完松手再按功能键。

会话级

快捷键作用
C-b d脱离会话(detach,最常用)
C-b s列出所有会话,可切换
C-b $重命名当前会话

窗口级

快捷键作用
C-b c新建窗口
C-b n / C-b p下一个 / 上一个窗口
C-b 0~9跳到第 N 个窗口
C-b ,重命名窗口
C-b &关闭当前窗口

面板级

快捷键作用
C-b %左右分屏
C-b "上下分屏
C-b 方向键在面板间移动
C-b x关闭当前面板
C-b z当前面板全屏 / 还原(超好用
C-b C-方向键调整面板大小

其他

快捷键作用
C-b ?查看全部快捷键
C-b [进入滚动模式(用方向键翻页,q 退出)
C-b :进入命令模式

刚上手记四个就够:d(脱离)、c(新窗口)、%(分屏)、z(全屏)。

四、命令行操作

bash
tmux new -s work          # 新建名为 work 的会话
tmux ls                   # 列出所有会话
tmux a -t work            # 接入(attach)work 会话
tmux a                    # 接入最近一个
tmux kill-session -t work # 杀掉会话
tmux kill-server          # 杀掉所有

# 在会话里执行命令(脚本里用)
tmux send-keys -t work "./deploy.sh" C-m

五、一份能用的配置

~/.tmux.conf

nginx
# 前缀键改成 Ctrl+a(比 Ctrl+b 好按,且不与 vim 冲突)
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# 窗口编号从 1 开始(0 太远了)
set -g base-index 1
setw -g pane-base-index 1

# 分屏用更直觉的 | 和 -
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

# 方向键切换面板
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# 鼠标支持:可以点面板、拖分割线、滚屏
set -g mouse on

# 状态栏
set -g status-style "bg=colour236,fg=colour250"
set -g status-left "[#S] "
set -g status-right "%Y-%m-%d %H:%M"

# 256 色
set -g default-terminal "screen-256color"

# 历史行数(默认只有 2000,翻日志不够)
set -g history-limit 20000

改完让配置生效:

bash
tmux source-file ~/.tmux.conf
# 或者在会话里按 C-b : 然后输入 source-file ~/.tmux.conf

六、典型工作流

场景一:服务器上跑部署

bash
ssh baize
tmux new -s deploy
C-b %                    # 左右分屏
# 左边跑部署脚本
./deploy.sh
# C-b → 切到右边,实时看日志
tail -f /var/log/nginx/error.log

场景二:本地开发

bash
tmux new -s blog
# window 1: 编辑器
vim index.html
# C-b c 新建 window 2
python3 -m http.server 8000
# C-b c 新建 window 3
git status

场景三:下班不断连

bash
# 下班了,直接 C-b d 脱离,关机回家
# 到家连上,tmux a,一切还在原来的位置

七、常见问题

问题解法
滚动不能用鼠标滚轮配置里 set -g mouse on,或用 C-b [ 进入滚动模式
复制粘贴很别扭按住 Shift 再用鼠标选中可绕过 tmux,或用 C-b [ + 空格 + 回车复制
颜色显示不对set -g default-terminal "screen-256color"
会话莫名消失服务器重启了。tmux 不持久化,可装 tmux-resurrect 插件解决
新面板路径不对配置里加 -c "#{pane_current_path}"

八、值得装的插件(可选)

用 TPM(Tmux Plugin Manager):

bash
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
nginx
# ~/.tmux.conf 末尾
set -g @plugin "tmux-plugins/tpm"
set -g @plugin "tmux-plugins/tmux-sensible"
set -g @plugin "tmux-plugins/tmux-resurrect"   # 保存/恢复会话
run "~/.tmux/plugins/tpm/tpm"

安装插件:C-b I(大写 i)。

tmux-resurrect 能解决「服务器重启会话全没了」的问题,C-b C-s 保存、C-b C-r 恢复。

不过说实话,不装插件的 tmux 已经解决 90% 的问题了。先把快捷键练熟,再考虑插件。


tmux 学习成本大概半小时,回报是「再也不用担心断线」。这是我在服务器上必装的第一批工具之一。