tmux运行原理和使用教程(SSH断掉之后如何保证程序的持续运行?)
tmux运行原理和使用教程(SSH断掉之后如何保证程序的持续运行?)
在Linux系统中,SSH断开后程序会随之停止运行,这给很多需要长时间运行程序的开发者带来了困扰。本文将介绍一个非常实用的工具——tmux,它可以帮助你在SSH断开后依然保持程序的持续运行。
tmux是什么?
tmux全称为terminal multiplexer,用户可以通过tmux在一个终端内管理多个分离的会话、窗口及面板。它的最大特点是不受断网影响,可以避免丢失重要工作进度,因此与SSH非常搭。
SSH时发生了什么?
SSH断掉时,server会杀掉你在SSH里运行的程序吗?答案是会!具体机理可以看这篇文章,我就懒得再解释了。看图说话:
比如Alice(client)想要SSH到Bob的电脑(server)上跑一个程序,例如java xxx
,那么如果这个程序耗时较长,或者Alice需要密切观察程序的输出,在Alice的SSH因为网络或者Bob电脑的设置等原因突然断线的情况下,一切都变成了浮云,这个java
程序会被Bob的电脑杀掉。我们可以把SSH程序当成一个同步模型。Alice也可以考虑在java
运行时写log,但是今天我们讨论一种更简单的方法,那就是tmux!
tmux运行原理
看图说话:
tmux采用client/server架构,当Alice ssh到Bob的电脑上并键入命令tmux时,她就默认启动了tmux服务器,并且创建了一个名字为0的session。我们可以把session当成一个bash环境:ssh启动了一个bash环境,这个session也启动了一个bash环境,不过session的环境独立于SSH,由在Bob电脑上运行的tmux服务器管理。所以ssh断掉完全不影响tmux session的正常运行。我们可以把tmux服务当做异步模型。相比ssh,孰优孰劣一目了然。
tmux使用举例
上图展示了一个tmux窗口:client端打开一个tmux session,然后分割成4个pane;在每个pane里ssh到server上并各开一个tmux session。注意client端的tmux和server端的tmux一定要区分开,不然就算不上真正理解并使用tmux。
使用tmux的正常操作为:ssh到server,(以下为server端操作)创建session,attach session,跑程序,(以下为client端操作)关掉ssh,喝杯咖啡,锻炼一下身体,心情愉悦之后,再ssh到server然后attach session,查看代码运行情况。tmux甚至重现了你离开之前的所有terminal输出!惊不惊喜?!
使用tmux的骚操作为:屏幕共享。Alice ssh到server上并创建一个session salice,Bob随后ssh到server上然后attach salice,那么Alice做的所有操作Bob都能看到,Bob也可以直接对session进行操作(当然Alice也可以看到),类似于两个人同时坐在server前进行现场表演,效果非常震撼。
tmux主要命令
以下内容主要参考:https://www.hamvocke.com/blog/a-quick-and-easy-guide-to-tmux/
动作 | 命令 |
---|---|
安装 | sudo apt-get install tmux |
左右分屏 | 同时按住Ctrl+b,释放之后,按Shift+%即可分屏 |
上下分屏 | 同时按住Ctrl+b,释放之后,按Shift+"即可分屏 |
切换pane | 同时按住Ctrl+b,释放之后,按方向键切换 |
关掉pane | 输入exit回车,或者Ctrl+d |
创建新窗口(覆盖原来的window) | 同时按住Ctrl+b,释放之后,按c |
切换到之前的窗口 | 同时按住Ctrl+b,释放之后,按p |
切换到之后的窗口 | 同时按住Ctrl+b,释放之后,按n |
注 | 后文Ctrl简写为C,例如Ctrl+b简写为C-b |
切换窗口 | C-b |
detach tmux | C-b d,或者tmux detach |
显示正在运行的tmux Sessions | tmux ls |
attach tmux | tmux attach -t session-name |
创建新Session并命名 | tmux new -s newname |
重命名现有的session | tmux rename-session -t oldname newname |
显示帮助命令 | C-b ? |
调整窗口大小 | C-b C- |
往上翻页 | C-b [,退出时按Esc |
上下翻页 | C-b PageUp/Page Down退出时按q |
关闭demo会话 | tmux kill-session -t demo |
关闭服务器,关闭所有会话 | tmux kill-server |
复制粘贴命令
命令 | 含义 |
---|---|
Ctrl-b, [ | 进入copy模式 |
arrow | 移动光标到需要复制的文本起点 |
C-space | 启动高亮文本功能 |
arrow | 移动到需要复制的文本末尾 |
Alt+w | 复制选中的文本到tmux剪贴板 |
C-b, ] | 粘贴复制过的文本 |