tmux可以干什么
- ssh远程到服务器后,执行一个费时的操作,断开ssh后任务可以继续执行,不会中断
- ssh到远程服务器,可以分屏,可以多任务,可以多窗口
tmux是什么
一般我们远程在服务其上工作都是通过远程连接软件进行操作,比如使用item2或者xshell之类的终端工具通过ssh来进行远程连接。如果需要进行一个比较耗时的操作,比如打包运行JavaWeb应用或者处理大文件,一般情况下我们希望可以在下班的时候进行,然后第二天上班就可以直接看到结果,这样可以合理的分配自己的工作时间。但是令人尴尬的是,正常通过ssh启动的进程都是ssh进程的子进程,如果ssh断开,ssh进程就会被系统kill,与此同时所有通过ssh启动的进程也都会被killed。这个时候,正常情况下我们会选择使用nohup等命令来让其后台运行,切断和ssh进程的联系。但是这样做也有很多不便之处,比如多命令运行,合理管控,工作环境恢复等等。这个时候就不得不提screen或者tmux等工具了。tmux可以看作是screen的升级版本,可以帮助我们后台运行任务,同时通过其回话,创建,分屏等功能,我们可以在ssh中完成更复杂的工作。即使工作过程中不慎断开连接,也可以在重新连接ssh后直接恢复回话,原来运行和打开的程序也都在正常运行,十分方便。
tmux是一个linux下面的工具,在使用之前需要安装,就像安装linux下的其他工具一样方便。首先我们通过ssh远程连接登入linux机器,我们将此时的环境称为终端环境。如果这个机器上并没有安装tmux,我们需要安装。例如在Cent OS上是yum install tmux
,完成之后我们就可以使用tmux命令了。tmux中有3种概念,会话,窗口(window),窗格(pane)。会话有点像是tmux的服务,在后端运行,我们可以通过tmux命令创建这种服务,并且可以通过tmux命令查看,附加到后端运行的会话中。一个会话可以包含多个窗口,一个窗口可以被分割成多个窗格(pane)。首先我们来看一下tmux的会话。
tmux的会话
1. tmux new -s session1
新建会话
使用 tmux new -s
命令新建一个会话 -s
(其实是session的头字母)。后面指定会话名即可。运行之后会从shell的终端环境进入到会话环境中,并停留在刚才新建的会话中。例如:
可以看到进入session之后的显示,在下面有一条绿色的状态指示栏,左边显示的是当前会话的名字,紧接着是会话中的窗口(window)序号以及窗口名字。关于窗口的概念我们后面再说,窗口名字后面有一个星号*表示是我们操作的当前窗口,一个会话中可以有多个窗口。当进入一个会话之后,会自动创建一个窗口。如上图所示,上面的环境在本章中称为会话环境。这样我们就已经开始了tmux的使用,如果此时关闭掉终端,下次在进入,该会话仍然在运行工。也就是说我们在刚刚进入的会话环境中使用wget下载一个超大的文件,或者是编译一个非常耗时的项目,我们关闭掉该终端,下次再进入,这个会话依然存在,会话里面运行的编译命令或者wget下载命令仍然在运行,并不会因终端的关闭而终止,这正是我们需要的功能。
2. ctrl+b d
退出会话,回到shell的终端环境
我们刚才是通过 tmux new -s
命令创建一个tmux会话并进入该会话的,如果要退出这个会话环境回到终端环境(会话里面的程序不会退出在后台保持继续运行)。应该如何操作呢,例如上图,当前我们在tmux的会话环境中,使用一个快捷键 ctrl+b d
(按ctrl+b
之后再按一个字母d
即可,字母d是detach的缩写)。操作之后的结果如下:
可以看到绿色的状态栏消失了,而顶部出现一个[detached]
,表示已经脱离tmux会话,现在已经不在tmux的会话环境中回到shell终端环境中了。
这里有必要说一下在tmux会话环境中,我们经常会用到tmux的组合键,一般的组合键中都会加一个前缀也就是 ctrl+b
另外,在后面的描述中,我们说的终端环境是指使用终端软件进入远程linux之后但是没有进入tmux的会话环境的状态。
通过上面的操作 ctrl+b d
之后,回到终端环境,实际上现在tmux的会话还在后台运行,如何查看呢。
3. tmux ls
终端环境查看会话列表
在终端环境中,我们可以通过tmux ls
命令来查看后台运行中的tmux的会话列表,例如:
可以看到在列出的列表中,只有1行,说明只有一个session,其中左边的session1
表示该session的名字,中间2 windows
说明该session1会话中有2个window,右边表示该会话创建的时间。如果该机器中有多个tmux会话在后台运行,那么这里会列出多行。因为tmux会话在后台运行,我们猜测实际上肯定是有tmux的进程在后台运行来维持这些会话。我们可以ps
看一下:
可以看到我们之前创建会话的命令还在后端运行。
4. ctrl+b s
会话环境查看会话列表
上面的命令中我们已经退出了tmux的会话环境,在终端环境中通过tmux ls
来列出当前linux机器后台运行的tmux会话列表。那么假设我们当前环境已经在tmux的会话环境中,我们如何得到当前tmux的会话列表呢,如果每次都要退出当前会话,先回到shell终端环境再运行tmux ls 来查看就很不方便,那么在tmux的会话环境中,我们可以通过 ctrl+b s
来获取当前linux机器上tmux所有的后台会话列表,例如操作之后显示如下:
此时可以通过方向键选择会话并回车,在会话间进行切换。
5. tmux a -t session1 从终端环境进入会话
如果在终端环境中运行 tmux ls
查看有tmux会话正在后台运行,如何进入到该正在后台中运行的会话呢,通过运行 tmux a -t session1
即可进入到该已存在的会话 session1
中。其中a字母是attach的头字母,表示附加,-t
指定要进入已存在的会话名,如果不存在则会报告 session not found
错误。
6. tmux kill-session -t session1
销毁会话
我们可以在终端环境和会话环境中销毁会话,例如在终端环境中运行 tmux kill-session -t session1
结束名字为session1的tmux会话。
在会话环境中运行 ctrl+b :
(注意按组合键之后再按一个冒号键),状态栏变成黄色之后提示我们可以在会话环境中输入命令,此时输入 kill-session -t session1
回车即可。其中session1是要销毁的会话名。
会话销毁之后,在终端环境中运行tmux ls
或者在会话环境中运行 ctrl+b s
则被销毁的会话不会再出现在会话列表中。
7. tmux rename -t old_session_name new_session_name
重命名会话
我们可以在终端环境中将会话重命名,如上面的命令,重命名之后通过 tmux ls 命令在终端环境中看到的列表中会显示会话的新名称。
8. ctrl + b $
重命名会话 (在会话环境中)
在会话环境中,我们可以通过前缀命令加上 $
的组合来重命名当前打开的会话的名字
tmux的window
一个tmux的会话中可以有多个窗口(window),每个窗口又可以分割成多个pane(窗格)。我们工作的最小单位其实是窗格。默认情况下在一个window中,只有一个大窗格,占满整个窗口区域。我们在这个区域工作。
本节我们讲解一下tmux窗口的相关操作,后面我们再说一下关于窗格(pane)的相关知识。首先在新创建的一个会话里面是会默认创建一个窗口的。正如我们上面提到过的图一样,如下所示:
新创建的会话中会默认创建一个窗口,该窗口名字一般是登陆终端的用户名@主机名
,我们可以通过 crtl+b ,
(组合键之后按一个逗号)来修改当前窗口的名字,如上图所示的窗口名字myserver1
就是修改之后的名字。该名字后面有一个*
号,表示该窗口是活动窗口(键盘输入会输入到该窗口中)
1. 创建window
可以在当前会话窗口中创建多个窗口,例如 ctrl+b c
创建之后会多出一个窗口如下图所示:
默认情况下创建出来的窗口由【窗口序号+窗口名字】组成,窗口名字可以由上面提到的方法修改,可以看到新创建的窗口后面有*
号,表示是当前窗口。
2. 切换window
在同一个会话的多个窗口之间可以通过如下快捷键进行切换:
ctrl+b p
(previous的首字母) 切换到上一个window。
ctrl+b n
(next的首字母) 切换到下一个window。
ctrl+b 0
切换到0号window,依次类推,可换成任意窗口序号
ctrl+b w
(windows的首字母) 列出当前session所有window,通过上、下键切换窗口
ctrl+b l
(字母L的小写)相邻的window切换
3. ctrl+b &
关闭window
ctrl+b &
关闭当前window,会给出提示是否关闭当前窗口,按下y
确认即可。当然,如果当前窗口的最后一个程序被exit掉后,窗口也会直接关闭。
tmux的pane
tmux的一个窗口可以被分成多个pane(窗格),可以做出分屏的效果。
1. ctrl+b % 垂直分屏(组合键之后按一个百分号),用一条垂线把当前窗口分成左右两屏。
2. ctrl+b " 水平分屏(组合键之后按一个双引号),用一条水平线把当前窗口分成上下两屏。
分屏之后光标停留在哪个pane上,表示该pane是活动的,另外一般情况下当前pane会被绿色的线条围起来。一般分屏之后当前窗口名字会重置为默认窗口名字。通过多次分屏操作,我们可以得到各种样子的分屏效果,例如下图显示的是一次垂直分屏之后,在右边pane中再次水平分屏的效果:
可以看到右下角的分屏是绿色框,说明是当前活动pane
3. 切换pane
ctrl+b o
依次切换当前窗口下的各个pane。
ctrl+b Up|Down|Left|Right
根据按箭方向选择切换到某个pane。
ctrl+b Space
(空格键) 对当前窗口下的所有pane重新排列布局,每按一次,换一种样式。
ctrl+b z
最大化当前pane。再按一次后恢复。
4. 关闭pane
ctrl+b x
关闭当前使用中的pane,操作之后会给出是否关闭的提示,按y确认即关闭。
tmux window中的历史输出查看
在tmux里面,因为每个窗口(tmux window)的历史内容已经被tmux接管了,当我们在每个tmux的window之间进行来回切换,来回操作,那么我们没有办法看到一个window里面屏幕上的历史输出。没办法使用鼠标滚动查看之前的内容,在终端中通过鼠标滚动看到的输出一定是各个tmux的window的输出混乱夹杂在一起的,如果要看当前窗口的历史内容,那么应该怎么办呢,通过在当前tmux的window 按 ctrl-b
进入copy mode(可以理解为vim的普通模式),然后就可以用PgUp/PgDn来浏览历史输出了,按q退出。
总结
tmux中的最重要的三个概念会话,窗口,pane的使用方法已经介绍完毕,其实这是我们操作tmux的最常用功能,如果掌握好,足以应付大多数工作。另外tmux还有一些高级用法,例如可以个性化的配置其组合键(官方默认的ctrl+b组合键按起来不太方便可以修改,UI设置,鼠标支持,复制粘贴等),但是我觉得这些高级功能基本不太用的到。如有需要大家可以自行查阅相关资料。
常见问题
- tmux的自定义配置
tmux可以通过自定义配置文件来覆盖默认配置,从从而更改tmux的默认行为,配置文件通常为~/.tmux.conf
。
添加如下两行,就可以使其支持utf8编码,同时开启vi默认的快捷键。详细vi默认下的快捷键可以参考文章:【使用 vi 模式操作tmux 屏幕】
set-window-option -g mode-keys vi #可以设置为vi或emacs
set-window-option -g utf8 on #开启窗口的UTF-8支持
通过自定义配置,你可以更改很多东西,比如默认的Crtl-b,可以更改为自己感觉更为顺手的快捷键。比如,我会设置为:crtl-c,因为vim用习惯了,这样更顺手。
- vim配色在tmux中显示异常
这个问题应该是vimer肯定会遇到的问题了,目前我按照网络上的教程并未解决我的问题,后续解决后会来更新。