tmux 终端复用
tmux 是终端复用器,可以在一个终端窗口里开多个面板和窗口,而且断开连接后程序继续跑。白话说就是"让你的终端变成分屏电视,而且关了遥控器节目不停"。
核心知识点
| 概念 | 说明 |
|---|
| 会话(Session) | 一个 tmux 实例,可以包含多个窗口 |
| 窗口(Window) | 类似浏览器的标签页 |
| 面板(Pane) | 窗口内的分屏区域 |
| 前缀键(Prefix) | 默认 Ctrl+b,所有 tmux 快捷键都要先按它 |
| 分离(Detach) | 离开 tmux 但不关闭(程序继续跑) |
| 附加(Attach) | 重新连接到之前的 tmux 会话 |
安装配置
# Ubuntu/Debian
sudo apt install tmux # 安装 tmux
# CentOS/RHEL
sudo yum install tmux # 安装 tmux
# macOS
brew install tmux # Homebrew 安装
# 确认安装
tmux -V # 查看版本
基本使用
会话管理
# 创建新会话
tmux # 创建一个默认名称的会话
tmux new -s work # 创建名为 "work" 的会话(推荐命名)
# 分离会话(程序继续跑,你可以断开 SSH 了)
# 按 Ctrl+b 然后按 d
# 或者
tmux detach # 命令行分离
# 查看所有会话
tmux ls # 列出所有 tmux 会话
# 重新连接会话
tmux attach -t work # 连接到名为 work 的会话
tmux a -t work # 简写
tmux a # 连接到最近的会话
# 杀死会话
tmux kill-session -t work # 关闭名为 work 的会话
tmux kill-server # 关闭所有 tmux 会话(慎用)
# 重命名会话
tmux rename-session -t 旧名 新名 # 重命名
# 或在 tmux 内按 Ctrl+b 然后 $
窗口操作(标签页)
所有操作先按前缀键 Ctrl+b,然后:
c 创建新窗口 # 新建一个标签页
w 列出所有窗口 # 选择要切换的窗口
n 下一个窗口 # 切换到右边的标签
p 上一个窗口 # 切换到左边的标签
0-9 切换到指定编号 # 直接按数字跳转
, 重命名当前窗口 # 给窗口起个名字
& 关闭当前窗口 # 关闭(会确认)
面板操作(分屏)
所有操作先按前缀键 Ctrl+b,然后:
% 左右分屏 # 垂直分割成左右两半
" 上下分屏 # 水平分割成上下两半
→←↑↓ 方向键切换面板 # 在面板之间移动光标
x 关闭当前面板 # 关闭(会确认)
z 全屏/恢复面板 # 把当前面板放大到全屏,再按恢复
o 切换到下一个面板 # 循环切换面板
q 显示面板编号 # 显示编号后按数字跳转
! 把面板变成窗口 # 当前面板独立成新窗口
调整面板大小
按住 Ctrl+b 不放,然后按方向键:
↑ 向上扩展
↓ 向下缩小
← 向左缩小
→ 向右扩展
或者:
Ctrl+b 然后 Alt+方向键(每次调整 5 行/列)
高级用法
自定义配置(~/.tmux.conf)
# 创建 tmux 配置文件
vim ~/.tmux.conf
# ~/.tmux.conf - 常用配置
# 把前缀键改为 Ctrl+a(更顺手)
unbind C-b # 取消默认的 Ctrl+b
set -g prefix C-a # 设置前缀键为 Ctrl+a
bind C-a send-prefix # 按两次 Ctrl+a 发送 Ctrl+a 本身
# 用 | 和 - 分屏(比 % 和 " 直观多了)
bind | split-window -h -c "#{pane_current_path}" # | 左右分屏,保持当前目录
bind - split-window -v -c "#{pane_current_path}" # - 上下分屏,保持当前目录
# 启用鼠标支持(可以用鼠标点击切换面板、拖动调整大小)
set -g mouse on # 启用鼠标(tmux 2.1+)
# 窗口编号从 1 开始(0 太远了不方便按)
set -g base-index 1 # 窗口从 1 开始编号
setw -g pane-base-index 1 # 面板从 1 开始编号
# 减少按键延迟
set -sg escape-time 0 # 按 Esc 不延迟
# 增加历史记录行数
set -g history-limit 50000 # 默认 2000 行太少了
# 用 vim 风格的方向键切换面板
bind h select-pane -L # h 左
bind j select-pane -D # j 下
bind k select-pane -U # k 上
bind l select-pane -R # l 右
# 快速重载配置
bind r source-file ~/.tmux.conf \; display "Config reloaded!"
# 按 Ctrl+a r 重新加载配置
# 状态栏美化
set -g status-style 'bg=#333333 fg=#5eacd3' # 状态栏颜色
set -g status-left-length 30 # 左侧长度
set -g status-right '%H:%M %Y-%m-%d' # 右侧显示时间日期
# 256 色支持
set -g default-terminal "screen-256color" # 终端类型
set -ga terminal-overrides ",xterm-256color:Tc" # True Color
# 重新加载配置(修改后生效)
tmux source-file ~/.tmux.conf # 命令行方式
# 或者在 tmux 内按前缀键 + r(如果配置了上面的快捷键)
复制模式(滚动查看历史输出)
# 进入复制模式(可以滚动查看历史输出)
Ctrl+b [ # 进入复制模式
# 在复制模式中(类似 vi 操作):
↑↓ 或 PgUp/PgDn # 上下滚动
Space # 开始选择
Enter # 复制选中内容
q # 退出复制模式
# 粘贴
Ctrl+b ] # 粘贴刚才复制的内容
常用生信场景
# 场景1:跑长时间的生信流程
tmux new -s pipeline # 创建会话
# 运行你的流程命令...
# Ctrl+b d 分离
# 关闭 SSH 也不影响,明天再 tmux a -t pipeline 回来看
# 场景2:同时监控多个任务
tmux new -s monitor # 创建监控会话
# Ctrl+b % 左右分屏
# 左边:htop 看系统资源
# 右边:tail -f 看日志
# Ctrl+b " 上下再分一个
# 下面:watch df -h 看磁盘空间
# 场景3:多窗口管理不同项目
tmux new -s work
# 窗口 1:代码编辑(Ctrl+b , 命名为 "edit")
# Ctrl+b c 创建窗口 2:运行服务(命名为 "server")
# Ctrl+b c 创建窗口 3:查看日志(命名为 "log")
# Ctrl+b 1/2/3 快速切换
发送命令到其他面板
# 在脚本中控制 tmux
tmux send-keys -t work "cd /data && ls" Enter # 在 work 会话中执行命令
tmux send-keys -t work:1.2 "htop" Enter # 在 work 会话的窗口1面板2 执行
# 创建完整工作环境的脚本
#!/bin/bash
tmux new-session -d -s dev # 后台创建会话
tmux send-keys -t dev 'vim' Enter # 第一个窗口开 vim
tmux new-window -t dev -n 'server' # 创建新窗口叫 server
tmux send-keys -t dev:server 'python app.py' Enter # 运行服务
tmux new-window -t dev -n 'log' # 创建新窗口叫 log
tmux send-keys -t dev:log 'tail -f /var/log/app.log' Enter # 看日志
tmux attach -t dev # 最后连接到会话
常见报错
| 问题 | 原因 | 解决 |
|---|
no server running | 没有 tmux 会话在运行 | tmux new 创建新会话 |
sessions should be nested with care | 在 tmux 里又开了 tmux | 按 Ctrl+b d 先退出再操作 |
| 颜色显示不正常 | 终端不支持 256 色 | 配置中添加 set -g default-terminal "screen-256color" |
| 鼠标不能用 | 没启用鼠标 | 配置中添加 set -g mouse on |
| 复制粘贴不工作 | macOS 需要额外设置 | 安装 reattach-to-user-namespace |
速查表
# === 会话管理 ===
tmux new -s 名称 # 创建命名会话
tmux ls # 列出会话
tmux a -t 名称 # 连接会话
tmux kill-session -t 名 # 杀死会话
Ctrl+b d # 分离当前会话
Ctrl+b $ # 重命名会话
# === 窗口管理 ===
Ctrl+b c 创建新窗口
Ctrl+b w 列出所有窗口
Ctrl+b n/p 下/上一个窗口
Ctrl+b 0-9 切换到指定窗口
Ctrl+b , 重命名窗口
Ctrl+b & 关闭窗口
# === 面板管理 ===
Ctrl+b % 左右分屏
Ctrl+b " 上下分屏
Ctrl+b 方向 切换面板
Ctrl+b z 全屏/恢复
Ctrl+b x 关闭面板
Ctrl+b q 显示面板编号
Ctrl+b ! 面板变窗口
# === 其他 ===
Ctrl+b [ 进入复制模式(滚动查看)
Ctrl+b ] 粘贴
Ctrl+b ? 帮助(所有快捷键)
Ctrl+b : 命令模式