一、Tmux 是什么?

Tmux(Terminal Multiplexer)是一个终端复用工具,核心作用是在一个终端窗口里管理多个会话(Session)、窗口(Window)和窗格(Pane)。我个人理解,它本质上是给 SSH 会话套了一层“容器”——tmux 本身是守护进程,里面的子进程不依赖于本地终端是否存活,所以即使关闭终端或网络断开,任务也不会中断。

对经常需要 SSH 连服务器的人来说,tmux 解决了两个痛点:一是网络断了重连后可以恢复之前的工作状态,二是可以在同一窗口里同时跑多个任务(比如一边编辑代码一边看日志)。

二、安装

系统命令
Ubuntu/Debiansudo apt install tmux
Arch Linuxsudo pacman -S tmux
macOSbrew install tmux
CentOS/RHELsudo yum install tmux

安装后用 tmux -V 确认版本即可。

三、核心概念(三层层级)

Tmux 的组织结构可以理解为三层:

  • 会话(Session):最顶层,一个会话就是一个独立的工作空间,可以在后台持续运行。给会话起名字非常重要,否则时间一长就忘了 0 号、1 号会话对应什么任务了。
  • 窗口(Window):会话里面的“标签页”,每个窗口占据整个屏幕。
  • 窗格(Pane):窗口可以分割成多个小区域,每个区域独立运行程序。

这个三层层级结构的好处是:每个会话可以对应一个项目(比如 blogleetcode),会话里的不同窗口可以对应不同的功能模块,窗格则用来同时查看多个输出。

四、常用命令速记

1. 会话管理

操作命令快捷键
新建会话(命名)tmux new -s 会话名
新建会话(不命名)tmux
分离会话(后台运行)tmux detachCtrl+b d
查看所有会话tmux lsCtrl+b s
连接会话tmux attach -t 会话名
重命名当前会话tmux rename-sessionCtrl+b $
杀死会话tmux kill-session -t 会话名
杀死所有会话tmux kill-server

新建会话时一定要用 -s 起名字,这样以后用 tmux attach -t 名字 就能直接恢复,不需要先查编号。

2. 窗口管理

操作快捷键
创建新窗口Ctrl+b c
切换到下一个窗口Ctrl+b n
切换到上一个窗口Ctrl+b p
切换到指定编号窗口(0-9)Ctrl+b 数字
切换到上一个激活的窗口Ctrl+b l
列出所有窗口Ctrl+b w
重命名当前窗口Ctrl+b ,
关闭当前窗口Ctrl+b &exit

小技巧:用 Ctrl+b w 可以列出所有窗口并交互式选择,比一个个翻页快多了。

3. 窗格(Pane)操作

操作快捷键
垂直分割(左右分屏)Ctrl+b %
水平分割(上下分屏)Ctrl+b "
光标切换到其他窗格Ctrl+b 方向键
光标切换到下一个窗格Ctrl+b o
显示窗格编号Ctrl+b q(编号消失前按数字跳转)
当前窗格缩放至全屏/恢复Ctrl+b z
关闭当前窗格Ctrl+b x
当前窗格拆分为独立窗口Ctrl+b !
交换当前窗格与前一个Ctrl+b {
交换当前窗格与后一个Ctrl+b }

分割窗口是 tmux 最常用的功能之一。垂直分割用 %,水平分割用 ",这两个符号需要记一下。分割后建议立即用 Ctrl+b z 把某个窗格临时放大专心操作,弄完再按一次恢复布局。

调整窗格大小

操作快捷键
按 1 个单元格调整Ctrl+b Ctrl+方向键
按 5 个单元格调整Ctrl+b Alt+方向键

Ctrl+b q 显示编号后,按对应数字可以瞬间跳转到目标窗格,在窗格数量多的时候非常实用。

五、复制模式与滚动

默认情况下,tmux 里不能用鼠标滚轮滚动历史输出,需要用复制模式。

进入复制模式:Ctrl+b [
退出复制模式:q

进入复制模式后的常用操作:

操作快捷键
向上滚动一行k
向下滚动一行j
向上翻页PageUpCtrl+b
向下翻页PageDownCtrl+f
开始选择文本空格键
复制选中内容回车键
粘贴Ctrl+b ]

如果想要鼠标滚轮直接滚动,需要在 ~/.tmux.conf 配置文件中添加一行:set -g mouse on,然后重新加载配置即可。这样就能用鼠标滚轮滚动历史输出了,体验会好很多。

六、配置文件(~/.tmux.conf)

个人配置在 ~/.tmux.conf,改动后需要 tmux source-file ~/.tmux.conf 重新加载。

下面是我自己用的配置:


# 启用鼠标支持(滚动 + 选择窗格)
set -g mouse on

# 设置历史缓冲区大小
set -g history-limit 10000

# 设置状态栏样式
set -g status-bg black
set -g status-fg white
set -g status-left "#[fg=green]#S#[default]"
set -g status-right "#[fg=yellow] %Y-%m-%d %H:%M #[default]"

# 重新加载配置的快捷键
bind r source-file ~/.tmux.conf \; display "Reloaded!"

# 使用 vi 风格的复制模式键位(与 vim 保持一致)
setw -g mode-keys vi

# 快速分屏(方便记忆)
bind | split-window -h
bind - split-window -v

# 使用 hjkl 移动窗格(vim 用户福音)
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

配置说明

  • Ctrl+a r 用来重新加载配置,调试配置文件时很方便。
  • |- 代替 %" 做分屏,视觉上更直观(竖线=垂直分屏,横线=水平分屏)。
  • hjkl 移动窗格,对习惯 vim 键位的人来说不用重新适应。

    七、高频用法场景

    场景 1:SSH 远程工作

    连上服务器后的标准流程:

    # 第一步,创建命名会话
    tmux new -s myserver
    
    # 正常干活...
    
    # 临时要断开,分离会话
    Ctrl+b d
    
    # 下次重新连,恢复
    tmux attach -t myserver

    日常工作必须:连上服务器后第一件事就是创建 tmux 会话,而不是直接跑命令。断线重连后用 tmux ls 查看会话,再用 tmux attach -t xxx 恢复,而不是重新开 shell。

    场景 2:同时编辑和运行

    在一个窗口里垂直分割成两个窗格:

    Ctrl+b %   # 左右分屏
    左边用 vim 编辑代码,右边运行程序,修改后立即测试。

    场景 3:监控多个服务

    窗口 1:跑 web 服务
    窗口 2:跑数据库
    窗口 3:跑日志监控

    窗口之间用 Ctrl+b n / Ctrl+b p 切换,每个窗口内部还可以继续分割。

    场景 4:长时间任务(数据训练/模型跑批)

    tmux new -s training
    # 启动训练脚本
    python train.py
    Ctrl+b d  # 分离会话,关闭终端
    # 第二天回来
    tmux attach -t training  # 任务还在跑

    这比 nohup 好多了,因为 nohup 只能让任务在后台继续跑,但无法重新连接到任务界面,而 tmux 可以随时恢复并查看实时输出。


    作者

    884705373@qq.com

    相关文章

    QLoRA微调原理详解:与LoRA的性能与内存对比

    引言:为什么大模型微调需要QLoRA? 在深...

    读出全部

    关于Norm的解析

    可以说,如果没有残差连接和 Layer No...

    读出全部

    从 SGD 到 AdamW 的优化器

    写在前面 在上一篇文章中,我们讨论了如何用数...

    读出全部