
不知道你有没有过这样的经历在Ubuntu服务器上敲了一条命令接下来是漫长的编译、打包或者数据传输。你盯着屏幕上跳动的日志不敢关终端窗口不敢开太多其他任务就怕一个不小心断掉几个小时白干。我干过太多次这种傻事。后来接触了tmux才算真正把终端用明白了。tmux是Ubuntu下非常经典的终端复用工具。简单说它能让你在同一个终端里创建出多个会话session每个会话里还能拆出多个窗口和窗格那些长任务在tmux会话里跑就算你的终端窗口关闭、SSH连接断开程序依然在后台正常运行。下次重新打开终端一条attach命令就能把之前的界面原样恢复。这篇内容不打算讲那些花里胡哨的理论就结合我在Ubuntu上的实际使用经验从安装、核心命令、窗口管理、配置文件到实战场景一步步带你把tmux会话玩熟练。新手跟着做完基本就能在日常开发里用起来已经会一点的老手也可以看看后面那些踩坑经验。1. 为什么说tmux是Ubuntu开发者的标配1.1 没有tmux的日子我在终端里遇到的三类麻烦说实话我第一次听说tmux的时候觉得这东西又是装完就吃灰的玩具。直到真正用了两周才后悔没早点上手。先用我自己的经历说说没有tmux的时候我在Ubuntu终端里有多狼狈。第一类麻烦是长任务容易中断。我做过一次大数据量迁移脚本要跑两三个小时。当时是用SSH连到服务器上直接拉起来跑的结果中途网络抖动连接一断进程就没了日志停在最后一行数据搬了一半。那感觉真的想摔键盘。其实这不是某个环境不好才有的问题而是终端会话和登录终端天然绑定导致的连接断开终端就收到挂断信号前台进程跟着被清理。第二类麻烦是任务一多终端窗口根本不够用。写代码的时候要开一个终端调试又要开一个看日志还要再开一个执行git命令。桌面上一堆终端窗口来回切换找来找去效率很受影响。当时的我还默默忍受后来才知道tmux早就把这些问题解决了。第三类麻烦是状态留不住。关掉终端就什么都没有了哪怕想临时去做别的事情回来后还得重新切目录、重新设环境变量、重新启动一遍服务。中间要是漏了一步反复排查特别浪费时间。1.2 tmux的核心理念把会话从终端里解放出来tmux解决这些问题的思路其实特别朴素它把终端会话和显示终端拆开了。你可以把tmux理解成一个在后台运行的服务它会替你管理所有正在执行的程序和它们的输出界面。你打开的终端窗口只是这个服务的一个显示器。当你运行tmux new -s work创建了一个名为work的会话这个会话就在后台独立运行了。之后哪怕你把终端窗口直接关掉会话里的进程也不会停。等你下次再打开终端用tmux attach -t work就能把那个会话连同里面所有窗口、输出历史、正在跑的命令原样接回来。这个点就是tmux和普通终端最大的区别。对Ubuntu用户来说不管是本机用还是在服务器上用这套后台常驻、随时接管的机制都极其好用。1.3 和nohup、screen相比tmux赢在哪肯定有朋友会说Linux里不是有nohup吗我为什么要学tmux这里我就不吹不黑把几个常见方案放一起对比一下。方案防断开交互式操作多任务/分屏恢复现场适用场景nohup可以不行跑起来没法再进去看不支持只能看日志文件临时后台跑一条命令screen可以基本可以用弱一般老牌方案能用但功能偏少tmux可以支持完整交互强窗口窗格随意拆完整体验需要长期开发/运维操作nohup适合那种启动完就不管了的场景因为它把命令的输出重定向到文件后你基本就告别了这个进程的交互界面想看进度还得打开另一个终端去tail日志。screen是老前辈思路和tmux类似但窗口分屏、自定义配置、复制粘贴这些细节做得比较粗糙。tmux在交互体验、分屏能力、配置灵活度上都更成熟这也是为什么现在的Linux运维和开发环境里tmux几乎成了默认选项。2. Ubuntu下安装和上手tmux2.1 一条命令装好tmux在Ubuntu上安装tmux非常简单。我测试过的20.04、22.04、24.04这几个版本官方软件源里都有tmux。直接执行sudo apt update sudo apt install -y tmux装完之后检查一下版本tmux -V正常会显示类似tmux 3.2a或tmux 3.4的信息。如果你用的Ubuntu版本比较老比如16.04装到的tmux版本会低一些部分新特性不支持但核心的会话功能是没问题的。如果对版本有要求可以去tmux官网找新版源码编译安装不过对绝大多数人来说apt装的就够用了。2.2 第一次会话必须会的四个命令tmux命令很多但新手期真正必须记牢的其实就四个。我建议你在Ubuntu的终端里同步操作一遍两分钟就能建立肌肉记忆。创建会话并指定名字tmux new -s test-s后面跟着的是会话名我一般习惯用能表达任务内容的词比如dev、build、web避免后面一堆会话找不到哪个是哪个。脱离会话进入tmux后你会看到底部多了一条绿色的状态栏这就说明你已经在tmux环境里了。按前缀键Ctrlb松开再按d就会脱离当前会话回到普通终端。注意d不是关闭而是脱离会话还在后台继续跑。查看会话列表tmux ls会列出当前所有存活会话带名字和窗口数量。只要会话还活着这条命令就能看到。恢复会话tmux attach -t test回到test会话。之后你看到的界面会神奇地保持着你脱离时的样子连光标位置都记得。这四个命令组成了tmux最核心的使用闭环创建、跑任务、脱离、回来继续看。2.3 会话的生命周期管理上面讲了创建和恢复但会话用久了总要面对几个现实问题会话太多怎么办怎么关闭会话怎么切换会话列举一些常用命令给会话改名在tmux里按Ctrlb再按$输入新名字回车。比创建时取错名字再新建一个强得多。关闭指定会话tmux kill-session -t test关闭所有会话把tmux服务停掉tmux kill-server这个命令杀伤力很大会直接结束所有会话和里面的进程用之前一定确认没有正在跑的任务。不脱离当前会话直接切换到另一个会话tmux switch -t other在tmux里也可以按Ctrlb s会弹出一个会话列表用上下键选择回车进入。这个交互式列表在会话多的时候非常方便。注意tmux里前缀键Ctrlb是按完就松开不是按住不放。刚上手的人很容易按成按住Ctrl再按b和d结果弹出一堆奇怪的字符。记住先按Ctrlb松开再按d。3. 把tmux的窗口和窗格玩明白3.1 三步理解session、window、pane的关系刚开始用tmux很多人会被session、window、pane这三个词绕晕。我用大白话给你捋一遍。session是会话相当于一个独立的工作区。你可以在一个session里干一个完整的任务。window是窗口session里可以开很多个window。打个比方session是一张书桌window是书桌抽屉。每个抽屉都能放一个独立的终端界面互不干扰。切换窗口就像换抽屉。pane是窗格window还能继续拆分。一个window可以横着拆成上下两半竖着拆成左右两半每一半就叫一个pane。这样你就能在一个窗口里同时看两个甚至更多终端画面。状态栏最左侧的信息是会话名:窗口序号.窗格序号比如test:0.1就表示你当前在test会话的第0个窗口的第1个窗格里。看懂了这串字符你就明白自己身处哪个层级了。3.2 分屏窗格一个屏幕当四个用窗格是tmux最让人上瘾的功能。在Ubuntu里写代码时我经常左边开着编辑器右边开一个终端跑测试上面再开一个窗口看日志一个屏幕全搞定。窗格操作基本都靠快捷键竖直方向分屏上下拆先按Ctrlb松开再按双引号水平方向分屏左右拆先按Ctrlb松开再按%百分号切换窗格焦点Ctrlb 方向键关闭当前窗格Ctrlbx按y确认也可以直接在窗格里执行exit当前窗格最大化/还原Ctrlbz在只有一个窗格和一个屏之间来回切换特别适合临时要仔细看某一块内容时用窗格大小调整默认快捷键是CtrlbCtrl方向键按一次微调一格。嫌慢的话可以在配置文件里绑定成Alt方向键后面配置章节会讲到。另外还有Ctrlb 空格可以循环切换窗格布局比如等分、全屏等在排版乱了的时候按几下很快就恢复整齐。说个我自己的习惯写代码的工作流最常用的是横向三分屏——左窗格写代码右上窗格跑测试右下窗格开个shell干杂活。这样一套配置完全不用再切桌面窗口。3.3 多窗口在会话里来回切换虚拟屏窗格适合同屏对比而窗口更适合一组相关但不需要同时看的终端。比如我在一个会话里建了三个窗口第一个窗口跑vim写代码第二个窗口启动开发服务器看日志第三个窗口执行数据库操作。常用快捷键新建窗口Ctrlbc下一个窗口Ctrlbn上一个窗口Ctrlbp直接跳到指定窗口Ctrlb 数字编号比如Ctrlb1窗口列表Ctrlbw弹出所有窗口的预览列表回车进入给窗口重命名Ctrlb,逗号输入名字回车。重命名后状态栏里会显示你给的名字否则只有默认的序号窗口和窗格可以同时用。比如窗口1里拆两个窗格窗口2保持全屏互不干扰。灵活组合之后一个会话真的能顶一整个IDE的终端区。4. 让tmux更好用的配置文件4.1 配置文件放哪、如何生效tmux的配置文件是用户目录下的.tmux.confvim ~/.tmux.conf如果你刚装的tmux这个文件可能不存在创建即可。改完配置后可以运行tmux source-file ~/.tmux.conf让配置立即生效不需要重启tmux。也可以在tmux里按Ctrlb:输入source-file ~/.tmux.conf回车效果一样。4.2 改了这几个设置手感会好很多下面是一份我常用的基础配置你可以直接用也可以根据自己的习惯调整。写清楚每行的作用方便你自己改。# 把前缀键从Ctrlb改成Ctrla # Ctrla离左手更近按起来比Ctrlb舒服 set -g prefix C-a unbind C-b bind C-a send-prefix # 开启鼠标支持滚动、点击切换窗格、拖拽调整窗格大小 set -g mouse on # 增加回滚历史行数默认2000行太少设置成10000 set -g history-limit 10000 # 绑定r键为reload配置改完配置后直接Ctrlb r即可生效 bind r source-file ~/.tmux.conf # 用Alt方向键调整窗格大小比默认的Ctrl方向键顺手 bind -n M-Left resize-pane -L 5 bind -n M-Right resize-pane -R 5 bind -n M-Up resize-pane -U 5 bind -n M-Down resize-pane -D 5 # 设置窗口/窗格编号从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} # 允许在任意窗格中切换窗口而不是只从当前窗口操作 set -g aggressive-resize on这里面有几个值得说两句的地方。开启鼠标支持是我特别推荐的第一步因为在终端里用鼠标滚动查看历史输出、用鼠标点击切换窗格确实降低了新手门槛。但要注意开启鼠标后在vim里进行复制粘贴时可能会出现需要按住Shift或右键菜单才能复制的现象这是终端应用和tmux抢鼠标事件导致的习惯一下就好。另外我绑定了一个很实用的行为Ctrlbr重新加载配置这样每次改完配置不用重启tmux、不用退出会话一键生效。开发高频改配置的时候这个绑定能省不少事。4.3 状态栏、配色和插件tmux默认的绿色状态栏看久了容易腻也可以改成其他颜色。两个常用配置# 状态栏底色和文字颜色 set -g status-bg black set -g status-fg white # 右侧显示当前时间 set -g status-right #[fgcyan]%H:%M #[fgwhite]%Y-%m-%d如果你想要更好看的状态栏社区里有tpmtmux插件管理器和tmux-powerline这类方案用Git拉取主题后配置。我自己早期折腾过一段时间后来反而把主题去掉了用的是自制的极简配置。因为主题脚本一多每次进入新会话都会多等零点几秒对强迫症不友好。功能上tmux默认能力已经完全够用。5. 实战tmux在Ubuntu上的典型工作流5.1 场景一跑一个持续几小时的编译或数据任务在Ubuntu上经常遇到要跑很久的任务比如编译一个大型C项目、做一次全量数据同步、训练一个模型。以前我会开着终端等现在统一用tmux处理。具体步骤# 1. 创建专属会话 tmux new -s bigjob # 2. 在会话里正常执行任务 ./build.sh # 3. 按Ctrlb松开再按d脱离会话 # 此时任务还在后台运行可以放心把终端窗口关了 # 下次想查看时 tmux attach -t bigjob一个很深的体会是tmux不仅仅防止了SSH断线带来的损失还让人从一个守着终端屏幕的人变成了遥控指挥的人。跑任务的时候我可以安心去写文档、处理邮件每隔一段时间attach进去看一次进度就行。5.2 场景二开发调试同时进行的本地工作台本地Ubuntu上写代码时我的tmux布局一般是这样一个会话、一个窗口、三个窗格。左侧大窗格是代码编辑器右上窗格是用来执行测试命令的小终端右下窗格是日志实时窗口比如用tail -f看服务端日志。操作流程创建会话tmux new -s dev先按Ctrlb%做左右分屏再在右侧按Ctrlb做上下分屏把左侧窗格切到编辑器右侧的两个分别切到测试终端和日志终端需要重新分屏布局时按Ctrlb 空格切换预设布局这套工作台的好处是所有操作在一个终端窗口里完成不用来回切换桌面上的多个窗口。而且因为tmux的窗格有自己的焦点管理你的手指几乎不用离开键盘。5.3 场景三配合SSH远程管理Ubuntu主机这是tmux使用频率最高的场景之一。我管理Ubuntu服务器时标准流程是这样的用SSH客户端登录服务器登录后先执行tmux attach -t work尝试恢复之前的工作会话如果没有这个会话就tmux new -s work新创建一个在会话里正常操作比如更新配置、重启服务、查看日志操作完成按Ctrlbd脱离会话再执行exit退出SSH登录这样即使SSH断开、网络波动服务器上的工作会话都还在。下次重新登录一条attach命令就能把所有状态接回来。这个方案不依赖任何三方工具是Linux运维里非常稳妥的常规操作。提示建议在SSH登录后的个人配置里加一条快速脚本比如在.bashrc里加一个别名alias tmuxxtmux attach || tmux new -s default。这样登录后直接输入tmuxx有会话就恢复没有就新建省去每次想命令的时间。6. 常见问题与排查技巧实录6.1 常见问题速查表下面这个表是我在实际使用中遇到过的几类问题整理出来给你参考。问题可能原因解决方法tmux: command not found没安装sudo apt install -y tmux关闭终端后会话也没了用的是exit退出而不是Ctrlbd脱离恢复方法没法找回只能重新建先改习惯在tmux里鼠标滚轮不能翻历史没开mouseset -g mouse on 并重新加载配置进入tmux后颜色和本终端不一致缺TERM或颜色配置在配置里加 set -g default-terminal screen-256color或设置TERMxterm-256color按Ctrlb没反应前缀键被改成Ctrla了检查.tmux.conf里的prefix配置tmux里复制粘贴内容带奇怪格式开启了mouse文本选择被tmux接管按住Shift再选或关掉mouse用官方复制模式kill-server后会话全部消失命令误操作没有后悔药重要任务不要用kill-serverattach时报错no sessions之前的会话被关闭或机器重启tmux重启后不会自动恢复可以用tmux-resurrect等插件或者养成脱机前确认的习惯6.2 几个容易忽略的细节第一个细节在tmux里执行exit命令退出当前shell和Ctrlbd是完全不同的。后者只是脱离会话还在前者会真正结束当前pane/window如果这是会话里最后一个窗口整个会话都会关闭。我见过不少新手想脱离tmux结果直接按exit回头发现会话没了还以为遇到bug。第二个细节tmux保存的是运行状态不是系统快照。机器重启之后所有tmux会话都会消失。如果你需要长期挂任务建议配合systemd或者写启动脚本而不是依赖tmux本身做持久化。也有一些第三方方案比如tmux-resurrect能让重启后恢复布局但进程本身还是救不回来的。第三个细节在tmux里跑图形程序比如gedit打开文件时需要注意DISPLAY环境变量是否正确。如果是从桌面终端进入tmux的一般没问题如果是从SSH登录的不要指望图形界面能直接弹出来。第四个细节配置命令不要在粘贴时带着不可见字符乱码。这是我踩过一次的坑从网页复制配置到.tmux.conf时多了一个全角空格结果tmux直接报错导致启动配置不加载。建议粘贴后先运行tmux source-file检查有没有报错或者干脆自己手动敲一遍。如果让我给刚接触tmux的人一句建议就是别想着一次学完所有快捷键。先把创建会话、脱离会话、恢复会话这一套闭环练到手再学窗格和窗口的基本操作等这些成为肌肉记忆后再去折腾配置文件和插件。我就是按这个顺序用的前面两三天还不习惯一周之后就再也回不去没有tmux的终端了。这篇先聊到这后面我还会写一些更进阶的用法比如tmux的复制模式、脚本化创建会话、结合后台服务做自动恢复之类的都是实际操作中摸索出来的经验。如果你在Ubuntu上跑tmux遇到什么问题欢迎在评论区交流我看到了会尽量回。