一、简介
Tmux 的全称是 Terminal MUtipleXer,即终端复用软件。顾名思义,它的主要功能就是在你关闭终端窗口之后保持进程的运行,它是一个远程多任务管理的工具(多会话+多窗口+工作现场保留和复原)。Tmux 与 Zsh、Vim 一起被大家称为“文本三巨头”,即使是在 GUI 发达的今天,Tmux 仍然拥有大量的用户。还有一个和 Tmux 相似的软件叫 Screen,不过 Screen 项目已经停止维护了。
为什么要用 tmux:
一般我们远程在服务其上工作都是通过远程连接软件进行操作,比如使用item2或者xshell之类的终端工具通过ssh来进行远程连接。如果需要进行一个比较耗时的操作,比如打包运行JavaWeb应用或者处理大文件,一般情况下我们希望可以在下班的时候进行,然后第二天上班就可以直接看到结果,这样可以合理的分配自己的工作时间。但是令人尴尬的是,正常通过ssh启动的进程都是ssh进程的子进程,如果ssh断开,ssh进程就会被系统kill,与此同时所有通过ssh启动的进程也都会被killed。这个时候,正常情况下我们会选择使用nohup等命令来让其后台运行,切断和ssh进程的联系。但是这样做也有很多不便之处,比如多命令运行,合理管控,工作环境恢复等等。这个时候就不得不提screen或者tmux等工具了。tmux可以看作是screen的升级版本,可以帮助我们后台运行任务,同时通过其回话,创建,分屏等功能,我们可以在ssh中完成更复杂的工作。即使工作过程中不慎断开连接,也可以在重新连接ssh后直接恢复会话,原来运行和打开的程序也都在正常运行,十分方便。
tmux 中几个重要概念:
- 会话(session): 建立一个 tmux 工作区会话,会话可以长期驻留,重新连接服务器不会丢失,我们只需重新 tmux attach 到之前的工作区就可以恢复会话,一个会话可以包含多个窗口。
- 窗口(window): 一个窗口可以被分割成多个窗格。
- 窗格(pane): 我们工作的最小单位是窗格,在窗格里执行各种命令。
二、安装
mac:
brew install tmux
ubuntu:
sudo apt-get install tmux
三、 常用操作
tmux 默认的快捷键前缀是 ctrl+b,比如,快捷键 ctrl+b k 的意思就是先同时按下 ctrl 和 b,然后松开,再按 k。
进入tmux后,状态栏颜色为绿色,状态栏显示的信息为 [<session_name>] 0:<window0_name> 1:<window1_name>* 2:<window2_name>,*所在的窗口为当前活动窗口。光标所在窗格为当前活动窗格。
在tmux会话环境中,按 ctrl+b : 可进入tmux命令行模式(下面状态栏变成橙色)。
通过 ctrl+b ? 可查询 tmux 的帮助文档和快捷键信息,按 esc 或 q 可退出帮助文档。
(1)会话(session)常用操作
操作 | bash命令 | tmux命令行模式 | 快捷键 |
---|---|---|---|
新建 session | tmux (默认通过数字编号来命名) tmux new -s <session_name> (创建一个会话后会默认创建一个窗口, 并从shell终端环境进入tmux会话环境, 关闭掉该终端,下次可再attach进入这个会话依) | new (默认通过数字编号来命名) new -s <session_name> | |
查看 session 列表 | tmux ls | ls (按 esc 或 q 退出) | ctrl+b s |
重命名 session | tmux rename -t <old_session_name> <new_session_name> tmux rename-session -t <old_session_name> <new_session_name> | ctrl+b $ | |
切换 session | switch -t <session_name> | ctrl+b s | |
离开 session (退出会话,回到shell终端环境,会话里面的程序继续在后台执行) | detach | ctrl+b d | |
进入 session | tmux attach -t <session_name> tmux a -t <session_name> | ||
关闭 session | tmux kill-session -t <session_name> | kill-session -t <session_name> |
(2)窗口(window)常用操作
操作 | bash命令 | 快捷键 |
---|---|---|
新建窗口 | tmux new-window -n <window_name> (在当前会话里新建窗口) | ctrl+b c (窗口默认名字为bash,用户名@主机名?) |
重命名窗口 | tmux rename-window <new_window_name> (重命名最当前窗口) | ctrl+b , |
切换窗口 | tmux select-window -t <window_name> (切换当前会话里的窗口) | ctrl+b n 切换到下一个窗口(next首字母) ctrl+b p 切换到上一个窗口(previous首字母) ctrl+b w 显示窗口列表,通过上下箭头选择窗口(windows首字母) ctrl+b 0 切换到0号窗口,依次类推,可换成任意窗口序号 ctrl+b l (字母L的小写)相邻的窗口切换 |
关闭窗口 | tmux kill-window -t <window_name> (关闭当前窗口) | ctrl+b & 关闭当前窗口 (会提示是否关闭当前窗口,按下y确认即可) |
(3)窗格(pane)常用操作
操作 | bash命令 | 快捷键 |
---|---|---|
左右切割窗格 | tmux split-window -h (切割当前窗格) | ctrl+b % |
上下切割窗格 | tmux split-window (切割当前窗格) | ctrl+b " |
切换窗格 | tmux select-pane -U 把当前光标移动到上方的窗格 tmux select-pane -D 把当前光标移动到下方的窗格 tmux select-pane -L 把当前光标移动到左边的窗格 tmux select-pane -R 把当前光标移动到右边的窗格 | ctrl+b <arrow key> 例如 ctrl +b ⬆ 会把光标移动到上方的窗格 ctrl+b ; 光标切换到上一个窗格? ctrl+b o 光标依次切换到当前窗口中的各个窗格 ctrl+b space (空格键) 对当前窗口中的所有窗格重新排列布局,每按一次,换一种样式。 |
交换窗格位置 | tmux swap-pane -U 当前窗格向上移动 tmux swap-pane -D 当前窗格向下移动 | |
最大化当前窗格 | ctrl+b z 再按一次后恢复 | |
关闭当前窗格 | ctrl+b x (会提示是否关闭当前窗格,按下y确认即可) | |
窗格显示时间 | ctrl+b t 点击回车键将会复原 | |
查看窗格日志 | ctrl+b [ (右上角会出现橙色的log页码,可用箭头或鼠标滚动查看,按 esc 或 q 退出) |
四、配置文件
tmux 的简单配置文件 ~/.tmux.conf 如下(如果没有可创建一个)
vim ~/.tmux.conf
set -g mouse on # 开启鼠标操作
# below reset tmux prefix command key
set -g prefix C-x
unbind C-b
bind C-x send-prefix
# set swap pane key
bind-key k select-pane -U
bind-key j select-pane -D
bind-key h select-pane -L
bind-key l select-pane -R
set-window-option -g utf8 on # 开启窗口的UTF-8支持
set-window-option -g mode-keys vi # 可以设置为vi或emacs
该配置文件把默认快捷键前缀 ctrl+b 改成了 ctrl+x,设置多个窗格之间的光标切换,比如可以通过 ctrl+x k 切换到上一个窗格。
五、常用工作方式
在公司上班时用台式机ssh远程登入开发机。
ssh alan@ubuntu
创建一个tmux会话(session)进行开发(每类工作或者每个项目都新建一个会话,通过 ctrl+b s 切换不同会话)
tmux new -s <session_name>
每个会话打开两个窗口(window),一个窗口用vim编辑代码,另一个窗口通过 ctrl+b % 或 ctrl+b " 切分多个窗格(pane),分别用于编译调试、git 操作、或其他 shell 命令。通过 ctrl+b n 和 ctrl+b p 或 ctrl+b w 快速切换不同窗口,通过 ctrl+b <arrow_key> 在不同窗格间移动光标。
tmux new-window -n <window_name>
晚上下班回家,用笔记本ssh远程登入开发机。
ssh alan@ubuntu
进入之前的tmux会话,里面打开的vim、cd目录通通保留,做到了“工作现场的复原”。
tmux ls
tmux a -t <session_name>
第二天去公司,台式机的ssh已经退出,重新ssh进去,进入之前的tmux会话,继续昨晚的工作,perfect !