tmux 使用笔记:断线不丢会话的效率工具
在服务器上跑长任务,最怕的就是 SSH 断线——进程跟着没了,几小时的白等。tmux 解决这个问题,顺便把「一个终端开多个窗口」这件事也做了。
一、为什么需要它
# 没有 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 是跑在服务器上的独立进程,终端只是「窗口」。窗口关了,进程还在。
二、三个层级
理解这个层级关系,剩下的就是记快捷键:
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(全屏)。
四、命令行操作
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:
# 前缀键改成 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改完让配置生效:
tmux source-file ~/.tmux.conf
# 或者在会话里按 C-b : 然后输入 source-file ~/.tmux.conf六、典型工作流
场景一:服务器上跑部署
ssh baize
tmux new -s deploy
C-b % # 左右分屏
# 左边跑部署脚本
./deploy.sh
# C-b → 切到右边,实时看日志
tail -f /var/log/nginx/error.log场景二:本地开发
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场景三:下班不断连
# 下班了,直接 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):
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm# ~/.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 学习成本大概半小时,回报是「再也不用担心断线」。这是我在服务器上必装的第一批工具之一。
