让我来描述一下场景:有一天,我正在调试一个耗时的特征生成器进程。我在我的 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 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 条评论