乐趣区

关于数据库:一文带你走进-Linux-小工具-tmux

一、背景

Linux shell 是 Linux 程序员、运维人员不可或缺的工具。往往是通过 ssh 工具(如 XShell 和 SecurtCRT)连贯到 Linux,执行 shell 命令。

你是否有遇到如下的状况:

(1)一个命令须要很长时间能力执行实现,然而因为与 Linux 连贯中断,或者执行的窗口敞开了,导致命令提前退出;

(2)须要同时看两个或更多的窗口,比照文件内容或监控多个工作。

如何解决上述遇到的状况,是否存在牢靠的工具可供使用?本期技术贴将为大家带来 Linux 小工具 – tmux 的介绍,它是一个 terminal multiplexer(终端复用器),能够启动一系列终端会话。次要特点是 shell 连贯断开后,窗口中依然放弃运行环境。当下次登录到该服务器后,能够通过 attach 命令连贯到之前的窗口,持续之前的工作。

二、装置

tmux 是一个用 C 语言开发的开源工具,源码地址:https://github.com/tmux/tmux,以后有 28.9k 个 star,可见其很受欢迎。只能在 Linux 生态的环境中运行,常见的 Linux 发行版中都内置了安装包,另外也能够源码装置。

1. 源码装置

git clone https://github.com/tmux/tmux.git cd tmux sh autogen.sh ./configure && make

2. 安装包装置

# Ubuntu 或 Debian $ sudo apt-get install tmux y  # CentOS 或 Fedora $ sudo yum install tmux -y  # Mac $ brew install tmux

三、基本概念

在应用 tmux 之前,先要理解 tmux 中的几个概念:

  • session(会话):tmux 的架构是由 server 和 client 组成,它们之间通过本地 socket 交互。一个 session 示意一个与 server 的连贯,容许任意多个使用者 attach 到这个 session 上,他们将看到完全相同的内容;
  • window(窗口):一个 session 蕴含任意多个 window,每一个 window 都占用整个屏幕;
  • pane(子窗口):window 能够被拆分成任意多个子窗口,称之为 pane,这些 pane 能够程度或垂直散布。

四、常用命令

1. 根底命令

(1)查看 tmux 命令列表

# 残缺语法:list-commands (lscm) [-F format] #罕用模式 tmux lscm

(2)查看快捷键

# 残缺语法:list-keys (lsk) [-T key-table] # 罕用模式:tmux lsk 
bind-key    -T prefix       C-o                   rotate-window 
bind-key    -T prefix       Space                 next-layout 
bind-key    -T prefix       !                     break-pane 
bind-key    -T prefix       \"                    split-window 
bind-key    -T prefix       %                     split-window -h 
bind-key    -T prefix       0                     select-window -t :=0 
bind-key    -T prefix       1                     select-window -t :=1 
bind-key    -T prefix       2                     select-window -t :=2 
bind-key    -T prefix       3                     select-window -t :=3 
bind-key    -T prefix       4                     select-window -t :=4 
bind-key    -T prefix       5                     select-window -t :=5 
bind-key    -T prefix       6                     select-window -t :=6 
bind-key    -T prefix       7                     select-window -t :=7 
bind-key    -T prefix       8                     select-window -t :=8 
bind-key    -T prefix       9                     select-window -t :=9 
bind-key    -T prefix       :                     command-prompt 
bind-key    -T prefix       \;                    last-pane 
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       c                     new-window 
bind-key    -T prefix       d                     detach-client 
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       Up                    select-pane -U 
bind-key -r -T prefix       Down                  select-pane -D 
bind-key -r -T prefix       Left                  select-pane -L 
bind-key -r -T prefix       Right                 select-pane -R 
bind-key    -T prefix       M-1                   select-layout even-horizontal 
bind-key    -T prefix       M-2                   select-layout even-vertical 
bind-key    -T prefix       M-3                   select-layout main-horizontal 
bind-key    -T prefix       M-4                   select-layout main-vertical 
bind-key    -T prefix       M-5                   select-layout tiled 
bind-key    -T prefix       M-n                   next-window -a 
bind-key    -T prefix       M-o                   rotate-window -D 
bind-key    -T prefix       M-p                   previous-window -a 
bind-key -r -T prefix       M-Up                  resize-pane -U 5 
bind-key -r -T prefix       M-Down                resize-pane -D 5 
bind-key -r -T prefix       M-Left                resize-pane -L 5 
bind-key -r -T prefix       M-Right               resize-pane -R 5

(3)快捷键的应用

当用户 attach 到一个 session 后,能够应用快捷键简化操作。tmux 中罕用的快捷键通过 ctrl+b 触发。也就说,用户先按下 ctrl+b,而后松开,再其余快捷键。

如上一节所示,常见的快捷:

0~9 示意抉择 0~9 对应的 window;

” 示意程度分隔 window,行将 window 分隔为两个程度散布的 pane;

% 示意垂直分隔 window。

2. session 相干命令

(1)开启一个新 session

# 残缺语法:new-session (new) [-AdDEPX] [-c start-directory] [-F format] [-n window-name] [-s session-name] [-t target-session] [-x width] [-y height] [command] #罕用模式 tmux new -n <window-name> -s <session-name>  # 或 开启匿名 session tmux

(2)查看存活的 session 列表

# 残缺语法:list-sessions (ls) [-F format] # 罕用模式 tmux ls

(3)关联一个 session

# 残缺语法:attach-session (attach) [-dErx] [-c working-directory] [-t target-session] # 罕用模式 tmux attach -t <sesion>

(4)拆散一个 session

# 残缺语法:detach-client (detach) [-aP] [-E shell-command] [-s target-session] [-t target-client] #罕用模式 tmux detach

(5)进行一个 session

  • 当 attach 到一个 session 之后,在 session 在窗口中执行 exit 进行以后 window,当最初一个 window 进行之后,session 主动终止。
  • kill-session [-aC] [-t target-session] # 罕用模式 tmux kill-session -t <session-name>
  1. window 相干命令

(1)新建一个 window

# 残缺语法:new-window (neww) [-adkP] [-c start-directory] [-e environment] [-F format] [-n window-name] [-t target-window] [command]  # 罕用模式:tmux neww -t <session-name[:session-index]> -n <window-name>

快捷键(ctrl +b):c

(2)退出一个 window

# 残缺语法:kill-window (killw) [-a] [-t target-window] # 罕用模式: tmux killw -t <window-name or window-index>

快捷键(ctrl +b):& 或在 shell 窗口执行:exit。

(3)切换 window

# 残缺语法:select-window (selectw) [-lnpT] [-t target-window] # 罕用模式 tmux selectw -t <window-name or window-index>

快捷键(ctrl +b):0~9

4. pane 相干命令

(1)程度拆分 window(pane)

# 残缺语法:split-window (splitw) [-bdefhIPv] [-c start-directory] [-e environment] [-F format] [-p percentage|-l size] [-t target-pane] [command] # 罕用模式:tmux splitw -h -t <pane-name>

快捷键(ctrl +b):%

注:程度拆分 window 是指拆分后,两个 pane 程度散布,即左右各一个窗口。

(2)垂直拆分 window(pane)

# 残缺语法:split-window (splitw) [-bdefhIPv] [-c start-directory] [-e environment] [-F format] [-p percentage|-l size] [-t target-pane] [command] # 罕用模式:tmux splitw -t <pane-name> 

快捷键(ctrl +b):”

注:垂直拆分 window 是指拆分后,两个 pane 垂直散布,即高低各一个窗口。

(3)查看 pane 列表

# 残缺语法:list-panes (lsp) [-as] [-F format] [-t target-window] # 罕用模式:tmux lsp

(4)切换 pane

# 残缺语法:select-pane (selectp) [-DdeLlMmRU] [-T title] [-t target-pane] # 罕用模式:# 抉择以后 pane 上面的 pane tmux selectp -D # 抉择以后 pane 下面的 pane tmux selectp -U # 抉择以后 pane 右面的 pane tmux selectp -L # 抉择以后 pane 右面的 pane tmux selectp -R # 抉择指定名字的 pane tmux selectp -t <pane-name or pane-index> 

快捷键(ctrl +b):Up、Down、Left、Right

(5)退出 pane

# 残缺语法:kill-pane (killp) [-a] [-t target-pane] # 罕用模式:tmux killp -t <pane-name or pane-index>

快捷键(ctrl +b):x 或在以后 pane 执行:exit。

(6)调整 pane 尺寸

# 残缺语法:resize-pane (resizep) [-DLMRUZ] [-x width] [-y height] [-t target-pane] [adjustment] # 罕用模式:# 向上调整 tmux resizep -U # 向下调整 tmux resizep -D # 向左调整 tmux resizep -L # 向右调整 tmux resizep -R

快捷键:ctl + b + [Up | Down | Left | Right]

五、利用场景

1. 后盾放弃工作环境(后盾运行程序)

小 A 同学是一名程序员,常常须要在 Linux 服务器上开发测试程序。他应用 xshell 连贯到 Linux 服务器上,设置本人的工作环境,而后开始本人的工作。有些工作一天做不完,但又不得不在上班时断开与服务器的链接,关掉 xshell 窗口,第二天再从新连贯 Linux 服务器,手动复原前一天的工作环境。特地是有些须要执行工夫很长的命令(比方编译、测试等),也不不便利用早晨上班后的工夫。

应用 tmux 能够很好解决下面的问题。首先,执行 tmux new -t <session-name> 创立一个名称为 <session-name> 的 session,执行后进入了 tmux 工作 window(窗口)。接下来,在该窗口中进行失常工作,在 tmux 的 window 与一般的 shell 窗口简直没有区别。当完结了一天工作,执行 tmux detach 退出 <session-name>。

第二天,应用 xshell 登录 linux 服务器,执行 tmux attach -t <session-name>   attach 到昨天的 session,此时看到的内容和昨天退出时齐全一样。

另外,还一个小技巧:如果忘了 session-name 还能够通过执行 tmux ls 查看 session 列表。

2. 多窗口比照
小 A 同学遇到了另外一个问题:在性能测试的时候他想同时看 CPU 实时应用状况、内存实时应用状况、实时输入的日志以及执行命令窗口。之前的做法是同时关上多个 xshell 的 tab,而后手动在屏幕上排列对齐。尽管也能解决问题,但很不不便。

如果应用 tmux 的 pane(子窗口)就能完满的解决该问题。首先,attach 到 tmux 窗口,此时看到的是一个窗口占据了整个屏幕;接着,执行 tmux splitw [-h] 或者快捷键 ctrl+b # 或 /” 分隔窗口。反复上述步骤,能够失去任意多的子窗口(pane)。

接下来,通过快捷键 ctrl+b Up/Down/Left/Right 在各子窗口之间切换,在各子窗口中进行不同的工作,比方右上窗口用 nomn 监督 CPU,右下窗口用 nmon 监督内存,左下窗口监督日志,左上窗口执行命令。

3. 合作开发
小 B 同学是小 A 同学的共事,是公司里的技术大牛。这次小 A 同学遇到了一个 bug,百思不得其解,就去请大牛小 B 同学帮忙。小 B 同学应用雷同的 Linux 用户登录到 Linux 服务器,而后 attach 到小 A 的 session,切换到小 A 正在应用的窗口。开始在窗口中疯狂地敲入各种命令,很快 bug 解决了。整个调试过程小 A 在他的电脑屏幕上都能够看到,因为同一个 session 的窗口在各个用户之间实时共享的。

退出移动版