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 断开了连接。我重新登录到 VM 的 shell,但它是空白的,就像你刚启动 shell 时通常那样。我最初的反应是恐慌,但后来我了解到我只需要重新访问我的 tmux 会话,因为它只是在后台嗡嗡作响。

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

将 tmux 用作窗口管理器

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

tmux 尤其是在运行 Docker 和 Kubernetes 时简直是救命稻草。将容器专用于其自己的窗格而不是打开新终端非常有用。主窗格允许我监控容器的健康状况。每当我需要进入容器时,我可以轻松打开一个新窗格。如果我愿意,我甚至可以同时在每个容器上运行 docker-compose updocker-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

实际上,这本身听起来就是一个很棒的文章主题。

回复 作者:cobra2

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

https://github.com/tmuxinator/tmuxinator

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

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

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

话又说回来,这不一定是要从一个完全切换到另一个。它们都是自由软件,它们可以和平共处。你可以根据需要使用其中一个或另一个!

回复 作者:carltm

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

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

回复 作者:sethkenlon

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

回复 作者:carltm

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

回复 作者:Steven Bakker

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

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.