ssh的最佳伴侣-tmux

tmux可以干什么

  • ssh远程到服务器后,执行一个费时的操作,断开ssh后任务可以继续执行,不会中断
  • ssh到远程服务器,可以分屏,可以多任务,可以多窗口
tmux

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

可以看到进入session之后的显示,在下面有一条绿色的状态指示栏,左边显示的是当前会话的名字,紧接着是会话中的窗口(window)序号以及窗口名字。关于窗口的概念我们后面再说,窗口名字后面有一个星号*表示是我们操作的当前窗口,一个会话中可以有多个窗口。当进入一个会话之后,会自动创建一个窗口。如上图所示,上面的环境在本章中称为会话环境。这样我们就已经开始了tmux的使用,如果此时关闭掉终端,下次在进入,该会话仍然在运行工。也就是说我们在刚刚进入的会话环境中使用wget下载一个超大的文件,或者是编译一个非常耗时的项目,我们关闭掉该终端,下次再进入,这个会话依然存在,会话里面运行的编译命令或者wget下载命令仍然在运行,并不会因终端的关闭而终止,这正是我们需要的功能。

2. ctrl+b d 退出会话,回到shell的终端环境

我们刚才是通过 tmux new -s 命令创建一个tmux会话并进入该会话的,如果要退出这个会话环境回到终端环境(会话里面的程序不会退出在后台保持继续运行)。应该如何操作呢,例如上图,当前我们在tmux的会话环境中,使用一个快捷键 ctrl+b d (按ctrl+b 之后再按一个字母d即可,字母d是detach的缩写)。操作之后的结果如下:

detach

可以看到绿色的状态栏消失了,而顶部出现一个[detached],表示已经脱离tmux会话,现在已经不在tmux的会话环境中回到shell终端环境中了。

这里有必要说一下在tmux会话环境中,我们经常会用到tmux的组合键,一般的组合键中都会加一个前缀也就是 ctrl+b 另外,在后面的描述中,我们说的终端环境是指使用终端软件进入远程linux之后但是没有进入tmux的会话环境的状态。

通过上面的操作 ctrl+b d 之后,回到终端环境,实际上现在tmux的会话还在后台运行,如何查看呢。

3. tmux ls 终端环境查看会话列表

在终端环境中,我们可以通过tmux ls 命令来查看后台运行中的tmux的会话列表,例如:

tmuxls

可以看到在列出的列表中,只有1行,说明只有一个session,其中左边的session1表示该session的名字,中间2 windows说明该session1会话中有2个window,右边表示该会话创建的时间。如果该机器中有多个tmux会话在后台运行,那么这里会列出多行。因为tmux会话在后台运行,我们猜测实际上肯定是有tmux的进程在后台运行来维持这些会话。我们可以ps看一下:

pstmux

可以看到我们之前创建会话的命令还在后端运行。

4. ctrl+b s 会话环境查看会话列表

上面的命令中我们已经退出了tmux的会话环境,在终端环境中通过tmux ls 来列出当前linux机器后台运行的tmux会话列表。那么假设我们当前环境已经在tmux的会话环境中,我们如何得到当前tmux的会话列表呢,如果每次都要退出当前会话,先回到shell终端环境再运行tmux ls 来查看就很不方便,那么在tmux的会话环境中,我们可以通过 ctrl+b s 来获取当前linux机器上tmux所有的后台会话列表,例如操作之后显示如下:

sessionls

此时可以通过方向键选择会话并回车,在会话间进行切换。

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)的相关知识。首先在新创建的一个会话里面是会默认创建一个窗口的。正如我们上面提到过的图一样,如下所示:

session

新创建的会话中会默认创建一个窗口,该窗口名字一般是登陆终端的用户名@主机名,我们可以通过 crtl+b ,(组合键之后按一个逗号)来修改当前窗口的名字,如上图所示的窗口名字myserver1就是修改之后的名字。该名字后面有一个*号,表示该窗口是活动窗口(键盘输入会输入到该窗口中)

1. 创建window

可以在当前会话窗口中创建多个窗口,例如 ctrl+b c 创建之后会多出一个窗口如下图所示:

create_window

默认情况下创建出来的窗口由【窗口序号+窗口名字】组成,窗口名字可以由上面提到的方法修改,可以看到新创建的窗口后面有*号,表示是当前窗口。

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 % 垂直分屏(组合键之后按一个百分号),用一条垂线把当前窗口分成左右两屏。

pane_v

2. ctrl+b " 水平分屏(组合键之后按一个双引号),用一条水平线把当前窗口分成上下两屏。

pane_h

分屏之后光标停留在哪个pane上,表示该pane是活动的,另外一般情况下当前pane会被绿色的线条围起来。一般分屏之后当前窗口名字会重置为默认窗口名字。通过多次分屏操作,我们可以得到各种样子的分屏效果,例如下图显示的是一次垂直分屏之后,在右边pane中再次水平分屏的效果:

pane_multi

可以看到右下角的分屏是绿色框,说明是当前活动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设置,鼠标支持,复制粘贴等),但是我觉得这些高级功能基本不太用的到。如有需要大家可以自行查阅相关资料。

常见问题

  1. 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用习惯了,这样更顺手。

  1. vim配色在tmux中显示异常

这个问题应该是vimer肯定会遇到的问题了,目前我按照网络上的教程并未解决我的问题,后续解决后会来更新。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Tmux: Terminal Multiplexer tmux 是什么 tmux 是一个终端复用器(termina...
    mlya阅读 1,039评论 0 0
  • 资料:https://www.cnblogs.com/wangqiguo/p/8905081.html sudo ...
    只知坚持_d778阅读 3,032评论 0 0
  • 在 Ubuntu 中安装Tmux: 在终端输入如下命令: sudo apt-getinstall tmux Tmu...
    MiracleJQ阅读 3,291评论 0 1
  • 上面提到服务器的任务不间断运行,就是利用了tmux的特性。就是说,一般ssh是断开就会停止所有之前连接ssh期间运...
    Solomon_Xie阅读 2,980评论 0 10
  • 使用 tmux new -s 命令新建一个会话 -s (其实是session的头字母)。后面指定会话名即可。运行之...
    原来是酱紫呀阅读 382评论 0 0