
说实话第一次接触tmux的人大部分都会在心里打鼓。做开发的朋友应该都听过这个名字最常见的推荐理由就一句话SSH连上服务器之后只要断网或者关掉电脑终端里跑着的任务就跟着没了用tmux可以让任务在后台稳定运行随时回去接着看。这个描述很准确但恰恰因为只强调了这一条很多人就把tmux和“复杂”“需要背一大堆快捷键”画了等号还没安装就先被劝退了。实际上TMUX的安装和使用真的没传说中那么玄乎。它核心就三个词会话、窗口、窗格。把这三个概念搞清楚再记住五六个高频命令你就能在十分钟内稳定地用它来干活。这篇文章我从零开始把tmux的安装步骤、最常用的操作方式、配置优化和常见坑一起过一遍希望能让你少走点弯路。1. 为什么你需要TMUX终端管理的真实痛点1.1 你曾经掉进过的终端陷阱我用一个真实的经历来说这件事。前两年有一次我在一台服务器上跑数据迁移脚本预计要跑十几分钟。当时图省事直接用SSH登录后裸跑结果中途本地Wi-Fi闪断了一下SSH终端卡了几秒后断开我重连回去发现迁移脚本已经中断了数据状态停在一个中间位置排查和清理花了比迁移本身还长的时间。从那以后凡是超过一两分钟的任务我都会先开tmux再接活。你可能也遇到过类似场景远程跑任务时不敢关笔记本因为担心万一连接断了几个小时的工作白费。或者是本地开了一堆终端标签页写代码在一个窗口看日志在另一个窗口启动服务又得再开一个标签页一多光切换就能把人逼疯。再或者你上午在公司电脑上改到一半的东西回家想接着看却发现现场已经没了只能重新来一遍。这几个痛点的本质其实都一样你真正想保留的是一个持续运行的工作环境而普通终端把它和脆弱的网络连接绑在了一起。tmux的价值就是把这个工作环境独立出来放到后台让它不随你的连接状态起伏。1.2 核心概念会话、窗口、窗格一次讲透tmux的概念体系其实特别简单一句话就能说完一个会话里可以开多个窗口一个窗口里可以拆成多个窗格。如果觉得这句话还是抽象我帮你打个比方。你可以把一个tmux会话理解成一个“房间”这个房间在后台一直存在你随时可以开门进去关门离开房间里的东西不会因为你离开而消失。窗口就是房间里的一块“显示器”你可以有多块显示器每块显示器上跑一个独立任务彼此互不干扰。窗格则是把一块显示器再切成几块同时展示不同的内容。文字上看可能有点绕动手画一下就清晰了TMUX 会话session ├── 窗口 1window │ ├── 窗格 1pane │ ├── 窗格 2pane │ └── 窗格 3pane └── 窗口 2window └── 窗格 1pane打个更日常的比方会话就像你电脑上保存的整份工程文件窗口像是文件里的不同页签窗格则是把某个页签分屏成左右两块。你关掉编辑器文件还在硬盘上同样你断开终端连接tmux会话里的任务还在继续跑。这个认知一旦建立起来后面所有命令都不用死记硬背因为你已经知道自己在操作哪一层了。2. TMUX安装几行命令的事安装tmux这件事本身没什么技术含量主流系统的软件源里基本都有现成包。绝大多数情况下你不需要从源码编译除非你确实需要某个特别新的特性否则不建议自己编译——tmux依赖libevent和ncurses源码构建时还得手动处理这几个依赖纯属给自己找事。2.1 Linux安装命令与权限提醒Debian系和Ubuntu系用apt就行sudo apt update sudo apt install -y tmux注意第一行命令是让你更新软件源索引不是可有可无的。如果你跳过它直接装有时候会提示找不到包。遇到过很多次新手运行apt install后报错E: Unable to locate package tmux基本都是因为源索引没更新。RedHat系、CentOS、Fedora这些系统用yum或者dnfsudo yum install tmux # 或者新一点的系统 sudo dnf install tmux这里有两个容易踩的坑。第一非root用户一定要加sudo不加sudo一般会提示权限不足或者报apt: command not found因为你当前用户没权限执行这些系统级操作。第二如果你是在云服务器或者新装系统上操作装完软件后最好先执行sudo apt update之类的步骤避免源索引过期。2.2 macOS与WindowsWSL的安装方式macOS上装tmux最方便的方式是用Homebrewbrew install tmux如果你的mac上还没装Homebrew那就先装Homebrew再执行上面这行命令。装完之后tmux命令就全局可用了不用额外配置什么。Windows这边稍微特殊一点。原生PowerShell和CMD跑不了tmux最推荐的是用WSLWindows Subsystem for Linux装好WSL后在Linux子系统里执行Linux版的安装命令。如果你平时主要用Windows做开发和运维又不想多维护一台虚拟机WSL是一个非常合理的选择它相当于在Windows里跑了一个轻量Linuxtmux在WSL里运行和在Linux服务器上运行效果完全一样。也有人会在Git Bash或者Cygwin里折腾tmux但体验明显不如WSL顺畅折腾成本也高除非有特殊需求否则我建议直接把注意力放在WSL上。2.3 验证安装结果版本查看与路径确认装完以后用两个命令确认一下安装是否正常tmux -V which tmux第一个命令会输出版本号比如tmux 3.4。看到版本号就说明安装成功可以继续往下用了。如果提示command not found那就是安装没成功或者PATH没配好回到上面对应系统的步骤再检查一遍。第二个命令会显示tmux可执行文件的路径比如/usr/bin/tmux主要是为了确认命令所在位置方便排查问题。3. 十分钟掌握TMUX的高频操作3.1 理解前缀键tmux快捷键的关键开关很多人卡在tmux快捷键上是因为没搞懂tmux快捷键的输入规则。tmux里所有快捷键都不是直接按的而是要先按一个前缀键再按功能键。默认的前缀键是Ctrlb也就是说所有操作都是这样一个固定动作先按住Ctrl键同时按b然后松开再按对应的功能键。这个设计乍一看有点奇怪但好处非常明显它把所有功能快捷键统一收纳到一个命名空间里几乎不会和终端里跑的程序冲突。比如你在vim里按Ctrlw那是vim的窗口切换tmux就不会来抢。如果你不用前缀键机制像ctrlc这种常用组合早就被占用光了tmux的功能键根本没法设计。后面讲到所有快捷键我都会直接写成“Ctrlb ?”这种格式意思是先按Ctrlb松开后再按问号代表的那个键。记住这一个规则整个tmux就通了一大半。3.2 创建会话与分离会话开始和暂停使用tmux的第一步是创建一个新会话。最常用的方式是指定一个名字方便后面辨认tmux new -s work输入这条命令当前终端屏幕会进入一个新的界面你就在tmux会话里了。现在你可以正常执行任何任务比如vim、top、python脚本都可以在这个会话里跑。当你临时想退出这个会话、但不想结束里面的任务时按下面这个组合键Ctrlb dd就是detach分离的意思。按完之后你会回到普通终端界面屏幕上会有一行提示大意是告诉你已经和会话分离了。但注意你之前启动的那些任务没有一个是被杀掉的它们都还在后台继续跑。这个操作是整个tmux里最重要的一步也是它和普通终端的本质区别。普通终端你只能关掉它任务随之结束tmux里你退出的是“查看窗口”而不是“运行环境”。3.3 回到会话列出、附加、关闭刚才把会话分离到了后台怎么回去呢先看看当前一共有哪些会话tmux ls这个命令会列出所有会话的列表每行一个显示会话名和窗口数量。例如我创建了一个叫work的会话就会看到类似这样的输出work: 1 windows (created Wed Jun 12 10:24:39 2024)回到这个会话用attach命令-t是target的意思后面跟会话名tmux attach -t work执行完你就回到了之前的会话里所有窗口、窗格、历史输出都还在就跟刚刚离开时一样。如果只有一个会话你也可以偷懒直接执行tmux attach或者tmux a它会自动连上唯一的一个会话。如果这个会话你确定已经没用了需要彻底结束它用kill命令tmux kill-session -t work这个操作会关闭整个会话以及里面的所有窗口、所有任务。执行前确认一下会话里面没有正在跑的重要任务因为不会有人再问你要不要保存。3.4 窗口与窗格多任务的正确打开方式一个会话里开多个窗口是tmux最实用的功能之一相当于终端里的浏览器标签页。我的习惯是开一个窗口跑编译开一个窗口看日志开一个窗口写配置全部在这一个会话里来回切换。常用窗口操作Ctrlb c 新建窗口 Ctrlb n 切到下一个窗口 Ctrlb p 切到上一个窗口 Ctrlb 数字 直接切到第N个窗口 Ctrlb , 给当前窗口重命名窗口多的时候一定要养成重命名的习惯。Ctrlb ,可以给当前窗口起个可读的名字比如log、code、build不然到后面全是默认的“0 1 2 3”切来切去根本分不清哪个是哪个。窗格则是在同一窗口里继续分屏适合需要同时看多个内容的场景。比如左边窗格跑服务右边窗格编辑配置文件改动完直接看效果不用来回切窗口。最常用的窗格操作Ctrlb % 左右分屏 Ctrlb 上下分屏 Ctrlb 方向键 切换到对应方向的窗格 Ctrlb x 关闭当前窗格 Ctrlb z 临时放大当前窗格再按一次还原分屏看起来简单真正用起来有个小细节值得注意如果当前终端字体支持中文且输入法停留在中文状态按Ctrlb %时可能会出现输入的是“5”的尴尬情况因为中文输入法会把百分号对应的组合键吞掉。所以按分屏快捷键之前先确认输入法处于英文状态。这个问题看着小但几乎每个新手都会碰到一次。4. 实际场景用TMUX托管一次完整的部署任务4.1 场景设定部署Python项目时遇到了什么说一个最常见的场景我要登录服务器部署一个Python项目操作包括拉取最新代码、安装依赖、执行数据库迁移、启动服务。这一套流程正常情况下需要几分钟如果依赖多、编译慢拖到十几分钟也很正常。问题在于部署过程中任何环节都容不得中断。比如数据库迁移执行到一半SSH断了迁移进程被杀死数据库可能留下不一致的状态。再比如包还在安装你笔记本电量告急合上盖子那一刻服务器上的终端会话也会跟着断开任务就悬在了半空中。传统的解决办法是用nohup把任务放后台但nohup只能把日志写到文件里你想临时看看进度、或者在任务完成后继续交互操作还得另外开窗口去tail日志很别扭。tmux的解法就自然得多任务在常驻会话里跑你随时attach回去看进度、操作终端整个过程和本地开着终端没什么区别。4.2 完整操作记录从登录到部署完成我们从头到尾走一遍这个流程。第一步登录服务器ssh userserver_ip登录成功后先创建一个叫deploy的会话tmux new -s deploy在会话里正常执行部署前的准备工作。假设项目代码在/opt/myappcd /opt/myapp git pull origin master拉取完代码安装依赖。这里我用Python项目举例实际工作中Node、Java项目也是一样的思路pip install -r requirements.txt依赖比较大时输出会持续滚动。这时候你不需要一直盯着屏幕按Ctrlb d分离会话该干嘛干嘛去。过几分钟再执行tmux attach -t deploy回来屏幕上的输出还是完整保留着你可以看到安装进度走到了哪一步。确认依赖装好之后继续执行数据库迁移python manage.py migrate迁移完成后启动服务。这一步尤其适合放在tmux里跑因为服务进程是常驻的你不想占着一个终端窗口不撒手也不希望它一断线就跟着断python manage.py runserver 0.0.0.0:8000服务启动之后你可以再次分离会话这样服务就会一直跑下去不受SSH连接状态影响。后续要查看服务输出、重启服务随时都可以重新attach回到这个deploy会话里操作。整个过程下来没有用过一次nohup操作体验完全是交互式的所见即所得。5. 配置优化从能用变顺手5.1 配置文件在哪创建你的第一次自定义tmux默认设置就能用但默认设置有几个地方不太符合我的习惯。比如前缀键Ctrlb每次按键都要往右下角够按久了手累再比如默认不能鼠标滚动翻历史这对于看长输出很不方便。好消息是tmux提供了配置文件把这些习惯问题一次改掉。配置文件默认路径在~/.tmux.conf。如果这个文件不存在自己创建就行touch ~/.tmux.conf然后选择你喜欢的编辑器往这个文件里写入配置项。配置文件的语法很简单一行就是一个配置格式是set -g 配置项 值g是global全局生效的意思。完全不理解这个语法也没关系照着样例抄就行。5.2 推荐优先开启的4个配置我把自己最常用的配置贴出来你直接复制就能用# 修改前缀键为Ctrla set -g prefix C-a unbind C-b bind C-a send-prefix # 开启鼠标模式 set -g mouse on # 增加历史回滚行数 set -g history-limit 10000 # 设置终端类型修复颜色显示问题 set -g default-terminal screen-256color逐条解释一下为什么改这几项。第一组配置把前缀键从Ctrlb改成Ctrla这个改动在tmux用户群里非常流行。原因是Ctrlb在shell里默认是光标左移有时会和其它按键冲突而且Ctrla在shell里是跳到行首改成Ctrla后这两个键的功能被合到一起操作起来顺手很多。注意改前缀键不是只改一行必须配合unbind C-b和bind C-a send-prefix一起用否则原前缀键还占着新前缀键也不响应。第二组开启鼠标模式改完之后你就可以直接用鼠标滚轮翻历史输出了也可以拖动窗格分隔线调整大小点击窗格切换焦点。对于从普通终端转过来的用户这个配置几乎能消除一半的不适应感。第三组history-limit设置的是每个窗格可回滚的历史行数默认值是2000行对于日志刷屏的场景完全不够用把它提高到10000行翻历史日志才没那么憋屈。第四组default-terminal设置成screen-256color主要是为了修复tmux内颜色显示不正确的问题。如果你在tmux里看到vim或者其他工具的颜色发灰、发暗十有八九是这项没配对。5.3 配置生效与状态栏微调配置文件改完之后不会自动生效。最温和的加载方式是执行tmux source-file ~/.tmux.conf这个命令会在当前会话里重新加载配置不需要中断正在跑的任务。如果你启动了一个全新的tmux会话新会话会自动读取配置文件也可以直接开新会话使用新配置。状态栏默认在底部显示的是会话名、窗口名、时间等信息。如果你觉得状态栏太花哨或者颜色不合口味也可以简单调一下# 改变状态栏背景色和前景色 set -g status-bg green set -g status-fg white # 状态栏刷新间隔单位秒 set -g status-interval 5我把状态栏背景改成绿色当警示用是因为有时候一个会话里窗口开太多状态栏太容易被忽视。如果你平时只在单个窗口、单个窗格里工作状态栏就算完全不管也没有问题它只是辅助信息。5.4 高频命令速查表为了方便你贴到笔记里我把常用命令整理成一张表格。保存到本地用之前扫一眼基本就不会忘了。操作命令或快捷键说明新建会话tmux new -s name创建并进入命名会话分离会话Ctrlb d离开会话但不结束任务查看所有会话tmux ls列出当前全部会话回到会话tmux attach -t name重新附加到指定会话结束会话tmux kill-session -t name彻底关闭指定会话新建窗口Ctrlb c在当前会话中创建窗口切换窗口Ctrlb n 或 p切换到下一个/上一个窗口重命名窗口Ctrlb ,给当前窗口命名左右分屏Ctrlb %创建左右两个窗格上下分屏Ctrlb 创建上下两个窗格切换窗格Ctrlb 方向键在窗格间移动焦点关闭窗格Ctrlb x关闭当前聚焦的窗格临时放大窗格Ctrlb z把当前窗格变全屏再按一次还原6. 常见问题与排查技巧实录6.1 滚轮不能翻页先分清是入口问题还是模式问题这个问题几乎每个人都会遇到。在tmux里打开一个长输出想用鼠标滚轮往上翻结果发现屏幕纹丝不动。原因很简单tmux默认没开启滚动支持你必须先进入它的“复制模式”才能回看历史内容。如果你不想用鼠标按一下Ctrlb [就进入了复制模式此时可以用方向键或PgUp/PgDn上下翻页按q退出复制模式。这个模式本意是配合复制操作用的很多人嫌它麻烦。更现代的解法就是我在配置里写的set -g mouse on。开启之后滚轮立即就能滚动历史输出了窗口分隔线也能用鼠标拖体验和普通终端基本一致。我强烈建议新用户一上来就加上这个配置它能消灭一大半刚上手的不爽感。6.2 任务还在不在断线重连的正确姿势“我刚才那个部署任务到底有没有被执行完”这是tmux新手最容易焦虑的问题。要彻底弄清楚这件事得理解tmux的进程模型当你新建一个tmux会话时系统会启动一个tmux server进程你的SSH终端只是这个server的一个客户端。断开SSH断掉的是client端server端和会话都还好好地在服务器上跑着。所以只要任务是在tmux会话里启动的断网、关机、关终端窗口都不影响它继续运行。需要区分一个坑如果你在SSH终端里直接执行任务并没有进入tmux会话那么断线后任务会随着SSH会话一起被终止因为终端断开时会向当前进程组发送挂断信号SIGHUP。tmux之所以能在断线后保留任务就是因为它把任务放到了另一个进程组接收不到这个信号。所以你部署长任务之前第一件事就是tmux new再开始做事这个习惯要养起来。6.3 多人共享会话远程协作的隐藏用法tmux还有一个很多人不知道的能力允许两个客户端同时附加到同一个会话。操作方式很简单你创建一个会话另一个人也执行tmux attach -t 同一个会话名两个人就进到了同一个环境。这个功能在协作排障时特别有用。比如你有一个测试环境别人连上来和你看到一模一样的内容你执行命令他能实时看到输出这比截图、录屏来得直接得多。不过要注意多个人同时操作同一个窗格时输入内容是全体共享的如果你的会话里有敏感操作最好提前沟通清楚避免误触。不同系统用户之间共享同一会话比较麻烦涉及socket权限同一台服务器上多人协作时建议用同一系统账户登录操作。6.4 attach后黑屏或布局错乱的应急处理有时候SSH断开重连、或者终端窗口大小变化之后重新attach会看到屏幕没刷新、窗格布局乱掉或者全是残留的旧字符。遇到这种情况先别慌不是你数据丢了只是tmux的显示状态没有同步回来。最简单的恢复方式是按Ctrlb z把当前窗格先放大再还原一次很多时候布局就恢复正常了。如果还是花的执行Ctrlb L是大写L这会强制刷新所有客户端的显示。再不行就按Ctrlb c新建一个窗口把工作区切换到新窗口里重新开始。这几个操作都不会影响正在运行的任务因为清掉的只是显示界面不是后台进程。6.5 终端类型导致的颜色或按键异常在tmux里使用vim或者一些交互式工具时偶尔会遇到方向键变成乱码、颜色不对、退格键删不掉字符这类问题。这些问题多半和TERM环境变量有关。tmux默认会把终端类型设置为screen有些程序不认这个类型就会出乱码。在.tmux.conf里设置了default-terminal screen-256color之后大部分颜色问题都能解决。如果问题依旧排查思路是先看tmux里的echo $TERM输出什么再对比普通终端里的输出。如果tmux里显示的是screen或dumb这类不完整类型优先考虑设置default-terminal。对于vim用户还可以在.vimrc里配置set termscreen-256color配合使用但这属于其他工具的调优范畴这里不展开。用tmux这么久我最直观的感受是它真正解决的并不是“让终端更好看”这种锦上添花的需求而是直接改变了你操作服务器的节奏。以前跑长任务时人得陪着终端等现在可以组合地用会话、窗口、窗格把整个工作流拆成分散的模块随时暂停随时继续连远程协作都变成了顺手的事。对刚开始接触tmux的朋友我的建议一直很明确别一上来就背完整快捷键表先把创建会话、分离、重连、开窗格这几件事玩熟用上一两周之后再按需加配置你会发现这个工具真的就是“原来如此简单”。