tmux 如何在你的 Linux 终端中激发快乐

像近藤麻理惠一样用 tmux 整理你的终端。
152 位读者喜欢这篇文章。
Linux keys on the keyboard for a desktop computer

让我来描述一下当时的情景:有一天,我正在调试一个耗时的特征生成器进程。我在我的 Mac 上打开了一个终端,并且连接到我的远程 Linux 虚拟机 (VM),进程将在这里启动。我用脚本检查了一些东西,一切看起来都很好。但是当我启动进程的时候,已经快到下班时间了。关闭我的笔记本电脑会终止我的 shell,进而终止进程。这个进程需要很长时间,我本来可以回家后调试结果,现在却不得不重新启动并等待它完成。我开始接受不得不加班的事实,对此感到很不高兴。

一位同事注意到了我的沮丧,问他是否可以提供帮助。我解释了我的问题,说肯定有办法让进程在关闭终端后继续运行,因为它是在远程 VM 上。我担心进程必须连接到我的 shell 才能不被终止。然后他向我介绍了 tmux

使用 tmux 远程运行脚本

首先,我用 yum 安装了 tmux。 然后我通过输入命令 **tmux** 启动了一个 tmux 会话。 我可以在这个 tmux 会话中做任何我在普通 shell 中可以做的事情。 由于我刚刚启动该进程,因此我在原始终端中终止了它。 然后我转到 tmux 会话并再次启动脚本以运行该进程。 最后,我像往常一样让笔记本电脑进入睡眠状态,结束了一天的工作。

当我再次打开笔记本电脑时,我的终端 shell 已经像我预期的那样从我的 VM 断开了连接。 我在 shell 上重新登录到 VM,但它像刚启动时一样是空白的。 我的第一反应是恐慌,但后来我了解到我只需要重新访问我的 tmux 会话,因为它只是在后台运行。

为了重新连接到我的 tmux 会话,我输入 **tmux ls** 来列出我所有打开的会话。 只有一个会话,会话 0。 为了返回该会话,我只需要执行 **tmux attach -t 0**。 瞧,会话出现了,我的脚本仍在运行。 我欣喜若狂,并迅速想知道我还能用 tmux 做什么。

将 tmux 用作窗口管理器

我从不关闭浏览器标签页,也从不关闭窗口,所以我可能在任何时候都打开并运行着大约 20 个或更多终端。 每当我打开一个新窗口,近藤麻理惠 可能都会感觉到一股力量的扰动。 但是,使用 tmux,我可以打开一个连接到 VM 的终端,并在该终端中拥有四个窗格,而不是打开四个都连接到同一个 VM 的终端,并试图跟踪它们以及它们在我终端列表中的位置。 这非常方便。 例如,我经常在 VM 上启动一个进程,然后需要去编辑某个地方的属性文件。 由于第一个进程仍在运行,因此我打开另一个终端来编辑文件。 然后我意识到我需要运行第二个进程,同时在另一个窗口中 tail 日志,以了解如何编辑我刚刚打开的属性文件。 如果没有 tmux,这将创建三个永远不会关闭的终端。

tmux 对于运行 Docker 和 Kubernetes 尤其有用。 将容器分配到其自己的窗格而不是打开一个新终端非常有帮助。 主窗格允许我监视容器的健康状况。 每当我需要进入容器时,我都可以轻松打开一个新窗格。 如果我想同时在每个容器上运行 **docker-compose up** 和 **docker-compose down**,我甚至可以只打开一个终端来完成。

这些窗格已经格式化并且彼此相邻,因此我不必收集所有连接到同一 VM 的终端,并尝试将它们拖放到我的监视器上,然后再在我需要打开一个新终端时重新执行所有操作。 tmux 甚至允许您动态调整各个窗格的大小! 完成后关闭窗格非常容易。 你不是在关闭到 VM 的终端; 你可以重新打开一个窗格。 这有助于我保持桌面清洁,而不是用遗忘的终端弄乱它。

重新映射 tmux 前缀

我最近了解到我可以重新映射 tmux 前缀,使事情变得更加容易。 在执行 tmux 命令(例如,创建新窗格、调整窗格大小或在终端中复制和粘贴一些文本)之前,您必须输入一个特定的按键模式,以让 tmux 知道您即将调用 tmux 命令,而不是任何 Linux 命令。 默认前缀是 **CTRL+b**。 例如,水平相邻于当前窗格打开一个新窗格的命令只是 **%**,但为了让 tmux 监听,您必须输入 **CTRL+b+%**。 **CTRL+b** 对我来说有点笨拙,所以我将它重新映射到反引号 (`)。 重新映射的前缀比必须点击两个位置不方便的键更流畅。 现在,如果我想要一个新窗格,我只需键入 **`+%** 并瞧!

tmux 从开始到结束

我在任何新的 Linux VM 上做的第一件事是安装 tmux。 我在任何连接到 Linux VM 的终端中做的第一件事是启动一个 tmux 会话! 我甚至在安装 tmux 后拍摄我的基本 VM 快照,这样如果我需要恢复到快照,我就不必重新安装 tmux。 无论何时我重新登录到 Linux VM,我总是执行 **tmux ls** 来查找我之前的 tmux 会话,然后连接到它并从我上次离开的地方继续。

接下来阅读什么
标签

12 条评论

我最近从 ``screen`` 切换到 ``tmux``,此后生活变得更加愉快了 33%。

我对这篇文章感同身受。

考虑到某个特定演示文稿的历史,我对以上没有撰写这篇文章感到非常惊讶。

自从我在 gnu 与 bsd 工具的比较中发现 tmux 以来,我就一直对它赞不绝口。

回复 作者 sethkenlon

你正在运行 macOS。 如果我没记错的话,它自带 Ruby 解释器...
接下来看看 Tmuxinator

https://github.com/tmuxinator/tmuxinator

只是想知道......tmux 可以做哪些 screen 做不到的事情? 我已经使用了 screen
多年,并且非常喜欢我创建的自定义状态行。 什么会
说服我切换到 tmux?

老实说,没有太多。 在我准备在 Linux Conf AU 上发表演讲并且意识到我需要一个终端的“演示模式”之前,GNU screen 是我的主要驱动程序。 我想保持终端全屏,但也要能够在我的笔记之间来回切换。 Tmux 可以做到这一点:你可以在一个终端窗口中打开 tmux,让它在一个屏幕(或计算机,就此而言)上,然后从另一个终端连接到同一个 tmux 会话 - 并且你在一个终端中输入的任何内容都会实时显示在另一个终端上。

从那时起,我决定这种灵活性对我来说非常好,所以我基本上切换到了 tmux(这样我可以更好地了解它)。 但这可能是一个非常小众的用例,因此这可能不会说服你使用 tmux 而不是 GNU Screen。

再说一次,它不必是从一个到另一个的完全切换。 它们都是自由软件,它们和平共处。 你可以根据需要使用其中一个!

回复 作者 carltm

有些人会将这种行为视为连接到同一会话的缺点:使用“screen”,多人可以连接到同一会话,但具有不同的、独立的视图。 使用 tmux,所有内容都在会话中共享。

要在 tmux 中模拟屏幕行为,你必须告诉 tmux 在与原始会话相同的会话组中启动一个新会话。 请参阅 tmux 的手册页“new-session -t”。

回复 ,作者:sethkenlon

我不知道你是否经常处理区域/窗格布局。在 tmux 和 screen 中,你可以将窗格/区域拆分为复杂的布局。区别在于,tmux 在你分离然后重新连接时会记住它。而 screen 会在你分离后立即忘记布局。如果你用它进行开发和监控,这会很痛苦。

回复 作者 carltm

哦,还有,tmux 允许大量的自定义和鼠标交互。我现在可以用鼠标选择和调整窗格的大小,同时选择文本,这些文本会自动复制到 tmux 粘贴缓冲区和桌面粘贴缓冲区。

回复 ,作者:Steven Bakker

你们似乎完全忽略了 byobu 的存在,byobu 是 GNU Screen 和 tmux 的一组配置文件,可以使一切变得更容易处理。自 2012 年以来,它一直是 ubuntu-server 的一部分,并且自 2014 年左右以来可以从其他发行版安装。试试看,F9 是调出帮助菜单的键!

不错,没听说过 byobu。我得试试。

回复 ,作者:Graham Cantin (未验证)

Creative Commons License这项工作已获得 Creative Commons Attribution-Share Alike 4.0 International License 的许可。
© . All rights reserved.