tmux 如何在您的 Linux 终端中带来快乐

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

让我来设置场景:有一天,我正在调试一个耗时的特征生成器进程。我在我的 Mac 上打开了一个终端,并且连接到我的远程 Linux 虚拟机 (VM),进程将在那里启动。我用脚本检查了一些东西,一切看起来都很好。但是当我启动进程时,差不多到了下班回家的时间了。关闭我的笔记本电脑会杀死我的 shell,这会杀死进程。这个过程需要很长时间,而且我无法在回家后调试结果,而是必须重新启动它并等待它完成。我开始接受我不得不加班的事实,并且对事态的这种转变感到不高兴。

一位同事注意到了我的沮丧,并问他如何提供帮助。我解释了我的问题,说必须有一种方法可以在我关闭终端后继续运行进程,因为它是在远程 VM 上。我担心它必须连接到我的 shell 才不会死掉。然后他向我介绍了 tmux

使用 tmux 远程运行脚本

首先,我执行了 `yum install tmux`。然后我通过输入命令 `tmux` 启动了一个 tmux 会话。我可以在这个 tmux 会话中做任何我在正常 shell 中做的事情。由于我刚刚启动了进程,我在原始终端中杀死了它。然后我转到 tmux 会话并再次启动脚本以运行该进程。最后,我像典型的下班结束一样让我的笔记本电脑进入睡眠状态。

当我重新启动笔记本电脑时,我的终端 shell 如我所料与我的 VM 断开了连接。我重新登录到 shell 上的 VM,但它是空白的,就像您刚启动 shell 时通常那样。我的最初反应是恐慌,但后来我了解到我只需要重新访问我的 tmux 会话,因为它只是在后台嗡嗡作响。

为了重新连接到我的 tmux 会话,我输入了 `tmux ls` 以列出我打开的所有会话。只有一个会话,会话 0。为了回到该会话,我只需要执行 `tmux attach -t 0`。瞧,会话出现了,我的脚本仍在运行。我欣喜若狂,并很快想学习 tmux 还能做什么。

使用 tmux 作为窗口管理器

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

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

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

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

回复 作者 carltm

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

为了在 tmux 中模拟 screen 行为,您必须告诉 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 是调出帮助菜单的键!

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