tmux的学习与使用

Tmux Learning

Tmux 安装和使用以及多场景应用

1. Tmux 是什么?

1.1 Tmux介绍

Tmux (Terminal Multiplexer) 是OpenBSD项目开发的一款BSD协议授权的终端复用软件,允许用户通过单一终端连接创建并管理多个控制台会话、窗口及面板,支持SSH断开后进程持续运行,避免重复建立远程连接。

Tip

BSD(Berkeley Software Distribution) 伯克利软件套件,是Unix的衍生系统于1977至1995年间由加州大学伯克利分校开发和发布

OpenBSD是一个多平台的,基于4.4BSD的类UNIX操作系统,是BSD衍生出的三种免费操作系统(另外两种是NetBSD和FreeBSD)之一,被称为世界上最安全的操作系统

常见的命令行的典型使用方式是:打开一个终端窗口(terminal window,以下简称 “窗口”),在里面输入命令。 用户与计算机的这种临时的交互,称为一次 “会话”(session)

Session 的重要特点:窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会跟着终止,不管进程有没有运行完。

常见的问题比如

  • SSH登录服务器,不小心点掉了关闭窗口,直接结束进程
  • 网络不稳定,突然断线,再次登录已经终止会话

为了解决这个问题,会话与窗口可以 “解绑”:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话 “绑定” 其他窗口。

1.2 Tmux的作用

本质上来说Tmux就是一个解绑工具,它允许你在单个终端窗口中创建多个虚拟终端对话,并能保持这些会话在后台运行

  • 它允许同时运行多个会话和多个命令程序
  • 它可以在新窗口接入已经存在的会话
  • 它允许每个会话有多个连接窗口,多人实时共享会话
  • 它支持窗口任意的垂直和水平拆分

2. 基本用法

其实Tmux并不复杂,虽然tmux有非常多的功能,但是主要掌握一些快捷键就行

2.1 Tmux安装

Tmux的安装非常简单,不同的系统对应不同的安装方式

# ubuntu
sudo apt-get install tmux

# CentOS 或 Fedora
sudo yum install tmux

# MacOS
brew install tmux

# bioconda
conda install -y tmux

2.2 Tmux启动

在安装完成后,终端直接输入,就会打开一个新窗口,这个就是tmux的虚拟终端

tmux

Tmux

打开之后就是tmux虚拟终端,可以说是伪终端。在这个终端中运行任务,这个任务就一直待在虚拟终端中,即使突然掉线了,还可以回复任务,继续运行

Important

最下面多了一条绿色状态栏,表示当前一个新终端里

2.3 前缀键

Tmux窗口有大量的隐藏快捷键(bind-key),所有快捷键都是通过前缀键唤起,默认的前缀键是 Ctrl+b,一定要在英文键盘的模式下,先按下 Ctrl+b,再按其它的键进行唤起。

例如先按下Ctrl + b, 再按下 ? ,下面是显示出来的一部分结果,整个Tmux中快捷键非常的庞大,只需要记住常用的即可

因为Linux Shell下很多快捷键都被占用了,所以只能这样子操作了

bind-key    -T prefix       ?                     list-keys
bind-key    -T prefix       D                     choose-client -Z
bind-key    -T prefix       E                     select-layout -E
bind-key    -T prefix       L                     switch-client -l
bind-key    -T prefix       M                     select-pane -M
bind-key    -T prefix       [                     copy-mode
bind-key    -T prefix       ]                     paste-buffer
bind-key    -T prefix       c                     new-window
bind-key    -T prefix       d                     detach-client
bind-key    -T prefix       f                     command-prompt "find-window -Z -- '%%'"
bind-key    -T prefix       i                     display-message
bind-key    -T prefix       l                     last-window
bind-key    -T prefix       m                     select-pane -m
bind-key    -T prefix       n                     next-window
bind-key    -T prefix       o                     select-pane -t :.+
bind-key    -T prefix       p                     previous-window
bind-key    -T prefix       q                     display-panes
bind-key    -T prefix       r                     refresh-client
bind-key    -T prefix       s                     choose-tree -Zs
bind-key    -T prefix       t                     clock-mode
bind-key    -T prefix       w                     choose-tree -Zw
bind-key    -T prefix       x                     confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key    -T prefix       z                     resize-pane -Z
bind-key    -T prefix       \{                    swap-pane -U
bind-key    -T prefix       \}                    swap-pane -D
bind-key    -T prefix       \~                    show-messages
bind-key -r -T prefix       DC                    refresh-client -c
bind-key    -T prefix       PPage                 copy-mode -u
bind-key -r -T prefix       Up                    select-pane -U
bind-key -r -T prefix       Down                  select-pane -D

3. 会话管理

3.1 新建会话

第一个启动的 Tmux 窗口,编号是 0,第二个窗口的编号是 1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话 (编码就在最下栏绿色边框里面能够看到,新开会话都会被自动编号)

使用编号很难区分,还要找每个会话,不够直观,最好的方法就是给会话起名

tmux new -s <session-name>

3.2 分离会话

在 Tmux 窗口中,按下 快捷键 Ctrl+b + d 或者输入 tmux detach 命令,就会将当前会话与窗口分离

Important

一定不能直接按exitCtrl + d 离开会话,会直接断开所有会话

tmux detach # 退出当前Tmux窗口,但是会话和里面的进程仍然在后台运行

tmux ls 命令能够查看当前所有的Tmux会话

tmux list-session

3.3 接入会话

在上面使用tmux detach 分离之后,后台继续运算,需要接入会话的时候,使用命令就能恢复到之前的会话框

tmux attach -t <session name> # 使用会话名称

tmux attach -t 0 # 使用会话编号

3.4 杀死会话

Shell一样,使用kill进行会话的结束,结束之后tmux ls将无法展示出来创建的会话

tmux kill-session -t 0 #使用会话编号

tmux kill-session -t <session-name> # 使用会话名称

3.5 切换会话

切换会话,是切换不同的session,比如之前创建了tmux new -t 多个会话,在会话之间切换

tmux switch

tmux switch -t 0

tmux switch -t <session-name> 

3.6 重命名会话

防止重命名会话冲突,可以用来修改会话的名字

tmux rename-session -t <old-name> <new-name>

4. 窗口管理

4.1 基本概念

会话(Session)
tmux会话是一个独立的运行环境,可以包含多个窗口,即使断开连接,会话也会在后台继续运行
窗口(Window)
每个会话可以包含个多个窗口,类似与浏览器中的标签页
面板(Pane)
每个窗口可以分割称多个面板,允许同时查看和操作多个终端

Tmux中,会话,窗口和面板都是用来表示不同层级的概念

tmux 会话(session)
 ├── 窗口1(window)
 │    ├── 面板(pane)
 │    ├── 面板
 │    └── 面板
 ├── 窗口2
 └── 窗口3

windows

窗口相当于 一个完整的终端屏幕。

  • 每个窗口都可以独立运行不同的程序,比如一个运行 htop,另一个运行 vim。
  • 默认一个 tmux 会话启动时就有一个窗口。
Note

可以把窗口理解成浏览器中不同的标签页

每个窗口内部可以再划分成多个面板,相当于一个窗口中再切分出来多个小终端,各个面板可以显示不同内容,执行不同命令

Panel

4.2 常用命令和快捷键

会话管理

操作 快捷键 说明
查看所有会话 Ctrl+b s 打开会话列表(可上下选择)
从当前会话分离(退出但保持后台运行) Ctrl+b d “detach” 当前会话
重新连接最近的会话 (命令行)tmux attachtmux a 重新进入上次分离的会话
在多个会话间切换 Ctrl+b ( / Ctrl+b ) 切换到上一个 / 下一个会话
重命名当前会话 Ctrl+b $ 给当前会话取个名字
杀掉当前会话 Ctrl+b : → 输入 kill-session 在命令模式中结束当前会话

窗口管理

功能 快捷键 说明
新建窗口 Ctrl+b c 创建一个新窗口(create)
切换到下一个窗口 Ctrl+b n next window
切换到上一个窗口 Ctrl+b p previous window
按编号切换窗口 Ctrl+b 0 ~ Ctrl+b 9 跳转到对应编号的窗口
列出所有窗口 Ctrl+b w 以菜单形式显示所有窗口(可选择)
重命名当前窗口 Ctrl+b , 修改窗口名称(默认是命令名,比如 bash)
关闭当前窗口 Ctrl+b &exit 关闭整个窗口(所有面板一起关闭)
切换到上一个活动窗口 Ctrl+b l 快速返回上一个使用的窗口
移动窗口位置 Ctrl+b . 移动窗口编号位置
查看窗口索引 状态栏中(下方默认显示 [0] bash [1] vim 等)

面板管理

功能 快捷键 说明
水平分割(上下分屏) Ctrl+b " 当前窗口上下分为两块
垂直分割(左右分屏) Ctrl+b % 当前窗口左右分为两块
在面板间切换 Ctrl+b o 依次循环切换到下一个面板
方向键切换 Ctrl+b ↑/↓/←/→ 按方向切换到相邻面板(更直观)
交换面板位置 Ctrl+b { / Ctrl+b } 当前面板与上一个/下一个面板交换位置
调整面板大小 Ctrl+b + 方向键 每次缩放一个单位
(更快调整) Ctrl+b Alt+方向键 快速调整面板大小(需终端支持)
显示面板编号 Ctrl+b q 显示编号(几秒后消失),再按编号跳转
关闭当前面板 Ctrl+b xexit 关闭该面板
最大化当前面板 Ctrl+b z 放大/还原当前面板(zoom in/out)
同步输入到所有面板 Ctrl+b : → 输入 setw synchronize-panes on 所有面板同时输入(例如批量执行命令)
取消同步 Ctrl+b : → 输入 setw synchronize-panes off 恢复单独输入
将面板变成新窗口 Ctrl+b ! 把当前面板独立成一个新窗口