让我来描述一下场景:有一天,我正在调试一个耗时的特征生成器进程。我在我的 Mac 上打开了一个终端,并连接到我的远程 Linux 虚拟机 (VM),该进程将在那里启动。我用脚本检查了一些东西,一切看起来都不错。但是,当我启动该进程时,差不多到了下班的时间。关闭我的笔记本电脑会杀死我的 shell,进而杀死该进程。这个过程非常耗时,而且我无法在回家后直接调试结果,而不得不重新启动它并等待它完成。我开始接受不得不加班的事实,并且对事态的这种转变感到不高兴。
一位同事注意到我的沮丧,问他如何能提供帮助。我解释了我的问题,说一定有一种方法可以在我关闭终端后继续运行该进程,因为它是在远程 VM 上。我担心它必须连接到我的 shell 才不会死掉。然后他向我介绍了 tmux。
使用 tmux 远程运行脚本
首先,我使用 yum 安装了 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 条评论