跳转至

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 里又开了 tmuxCtrl+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 :    命令模式