zoukankan      html  css  js  c++  java
  • GNU Screen Usage

    分屏:

    1.在终端输入screen命令

    2.Ctrl+a 然后shift+s 上下分屏,切换到下方Ctrl+a tab然后新建一个window(Ctrl+a c)

    3.切换到上方,Ctrl+a tab,关闭window(Ctrl+a x或者输入exit)

    左右分屏在centos下好像不可以,据说要ubuntu、debian(Ctrl+a |)

    一、使用screen管理会话

          在使用SSH或telnet远程连接服务器时,可能都遇到为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。也许nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端, nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。

    nohup <command> [argument…] &

          虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂交互的程序就麻烦了。那么现在过来瞧瞧screen吧!

          screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。当断开或关闭终端时,只要不杀死screen的进程,待重新连接后任能继续断开前的操作。

          启动screen方式有两种,一种是直接在命令提示符下输入screen,这时Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。另一种方式是在screen命令后跟你要执行的程序,例如“ screen ftp”,Screen创建一个执行ftp命令的单窗口会话,退出ftp将退出该窗口/会话。

    screen的语法格式如下:

    screen [ -options ] [ cmd [ args ] ]

    常用的选项有:

        -c file	使用配置文件file,而不使用默认的$HOME/.screenrc
        -d|-D [pid.tty.host]	不开启新的screen会话,而是断开其他正在运行的screen会话
      -h<行数>  指定视窗的缓冲区行数。
      -m  即使目前已在会话中的screen会话,仍强制建立新的screen会话。
      -r sessionowner/ [pid.tty.host]	重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限。
      -R  先试图恢复离线的会话。若找不到离线的会话,即建立新的screen会话。
      -s  指定建立新screen会话时,所要执行的shell。
      -S sessionname	创建screen会话时为会话指定一个名字
      -v  显示版本信息。
      -x  恢复之前离线的screen会话。
      -ls或--list  显示目前所有的screen会话。
      -wipe  检查目前所有的screen会话,并删除已经无法使用的screen会话。
    

    screen常用的组合键描述如下:

    * 普通列表项目

    Screen常用选项

    使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:

    Screen 常用选项
    Screen 常用选项

    因为screen把C-a看作是screen命令的开始,所以如果你想要screen窗口接收到C-a字符,就要输入C-a a。Screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:

    -exy x为命令字符,y为转义命令字符的字符

    下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t ?命令可以看到该变化。

    [root@tivf18 root]# screen -e^tt
    自定义命令字符和转义字符
    自定义命令字符和转义字符

    其他常用的命令选项有:

     
    -c file 使用配置文件file,而不使用默认的$HOME/.screenrc
    -d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
    -h num 指定历史回滚缓冲区大小为num行
    -list|-ls 列出现有screen会话,格式为pid.tty.host
    -d -m 启动一个开始就处于断开模式的会话
    -r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
    -S sessionname 创建screen会话时为会话指定一个名字
    -v 显示screen版本信息
    -wipe [match] 同-list,但删掉那些无法连接的会话

    下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r <screen_pid>重新连接上:

    [root@tivf18 root]# screen –ls
    There are screens on:
            8736.pts-1.tivf18       (Detached)
            8462.pts-0.tivf18       (Detached)
    2 Sockets in /root/.screen.
    
    [root@tivf18 root]# screen –r 8736

    如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

    [root@tivf18 root]# kill -9 8462
    [root@tivf18 root]# screen -ls  
    There are screens on:
            8736.pts-1.tivf18       (Detached)
            8462.pts-0.tivf18       (Dead ???)
    Remove dead screens with 'screen -wipe'.
    2 Sockets in /root/.screen.
    
    [root@tivf18 root]# screen -wipe
    There are screens on:
            8736.pts-1.tivf18       (Detached)
            8462.pts-0.tivf18       (Removed)
    1 socket wiped out.
    1 Socket in /root/.screen.
    
    [root@tivf18 root]# screen -ls  
    There is a screen on:
            8736.pts-1.tivf18       (Detached)
    1 Socket in /root/.screen.
    
    [root@tivf18 root]#

    -d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname

    启动一个初始状态断开的screen会话:

    [root@tivf06 tianq]# screen -dmS mygdb gdb execlp_test

    连接该会话:

    [root@tivf06 tianq]# screen -r mygdb

            例如当我们ssh登录服务器后,使用scp在传输大文件时,通常的情况就是要耐心的等待文件传输完成才能将终端关闭,那么下面来看看通过screen带来的方便。

    首先使用ssh登录服务器,在命令提示符下输入screen:

    # screen

          在screen shell中输入scp命令,输入密码后开始文件传输。如果不愿意等待,那么直接按下”Ctrl+a+d”的组合键,或者关闭当前的终端,随便怎么操作,只要不杀死screen会话就行。

    # scp -r images 172.16.78.111:~
    root@172.16.78.111's password:
    mondorescue.iso                                                  0%   22MB  22.2MB/s   00:01
    

    使用screen -ls可以查看当前系统所打开的screen会话,如下:

    # screen -ls
    There are screens on:
            20642.pts-1.white       (Detached)
            20713.pts-1.white       (Detached)
    2 Sockets in /tmp/screens/S-root.
    

    若要其中的会话,则输入screen -r PID,如下:

    # screen -r 20713
    

    执行该命令后,马上就能看到刚才正在进行的scp命令的完成情况 。

    screen:第一次使用的时候,输入screen,即新建了一个session,然后默认有一个shell窗口,下面会有状态栏显示窗口的名称,通常是“0 bash”。ctra a + A:假如你想重命名这个窗口,按ctra a,然后A,就可以重命名ctrl a + c:新建窗口screen -t name:新建名字为name的窗口ctrl a + n or p:切换窗口,n next,p previousctrl a + “:列出所有的窗口,也可以在状态栏观察到screen -S name:新建一个session 名字为namectra a + d:使得当前的session detached,这个是很重要的一个命令,这个命令使得你临时退出了该session,而下次可以进行重新连接screen -ls:想进行重新连接的时候,你需要知道你的screen session是哪一个,然后使用screen -r id命令,ls列出了所有的screen session的id,当然假如你使用screen -S name创建的session的话,会有一个名字,更便于记忆screen -r id/name:重新连接screen session id/name,即恢复访问你之前打开的诸多窗口exit:退出当前的窗口ctrl a + K:kill当前窗口

    哈利波特有魔杖,雷神托尔有金色的巨锤,Buckethead 有斧子,但是这些武器与 QWERTY 键盘相比只是小儿科。只需在命令行上敲几下,就可以启动网站、招募军团或击败可怕的火龙。

    但是,QWERTY 键盘有一个严重的缺点:它很容易发生连接中断。电话线上的噪音、无线连接中断或者网络超时都可能导致远程 shell 中断。如果您已经在某个工作(比如调试一个应用程序)上花费了好几小时,而一下子就丢失了所有成果,一定会很沮丧的。

    不过这种灾难是可以避免的。使用 GNU Screen 就可以了。Screen 可以在一个控制台(即与主机物理连接的哑终端)、xterm 窗口或 Secure Shell (SSH) 登录 shell 中创建和管理多个 shell 窗口。可以从一个 shell 窗口迅速切换到另一个窗口,可以离开正在运行的 shell 并在任何时候重新连接。实际上,Screen 提供许多虚拟化的控制台。

    图 1 到图 5 展示 Screen 的特性和操作。看一下 图 1,这里假设用户已经使用 SSH 登录到一台远程主机。最初,在本地主机(比如您的笔记本或桌面计算机)上有一个本地 shell 和一个远程 shell。通常,使用远程 shell 在远程主机上运行命令;输出经过加密之后通过 SSH 连接发送到本地 shell。(在各张图中,用蓝色表示当前可见的 shell 输出)。但是,如果本地 shell 或远程 shell 或它们之间的连接中断了,远程 shell 就会终止,您的工作成果就会丢失。

    图 1. 典型的 SSH 连接

    典型的 SSH 连接

    图 2 显示在远程主机上启动 Screen 之后的情况。Screen 实用程序启动,进而启动一个新的 shell 窗口A,可以在此窗口中运行命令。A 的输出是可见的(由蓝色表示);这个 shell 的输出经过 Screen,再经过远程登录 shell,最后通过 SSH 到达本地登录 shell。

    图 2. Screen 管理 shell 窗口

    Screen 管理 shell 窗口

    Screen 本身并不 “露面”;它是一个代理,其作用是在它管理的正在运行的可用窗口中做出选择。在任何时候,Screen 只能显示一个窗口的输出。可以把 Screen 看作虚拟的键盘-视频-鼠标 (KVM) 开关。

    但是,也可以断开与 Screen 的连接,见 图 3。Screen 代理仍然存在,它控制的所有窗口也还存在,但是与 Screen 的连接临时切断了,这会让用户返回到远程登录 shell。

    图 3. 可以断开与 Screen 的连接,而它管理的窗口仍然存在

    可以断开与 Screen 的连接,而它管理的窗口仍然存在

    图 4 显示一种可能出现的情况。已经重新建立了到 Screen 的连接,还创建了另外两个窗口(B 和C)。窗口 A 和 B 继续运行 shell 和所有附属作业,但是只有 C 的输出是可见的。当然,可以在窗口之间切换以监视各个作业的状态。

    图 4. Screen 可以管理多个窗口

    Screen 可以管理多个窗口

    最后,图 5 显示中断与 Screen 的连接并终止远程登录 shell 的情况。Screen 和它的窗口仍然存在。可以重新登录并连接 Screen(并通过 Screen 代理连接到它的窗口),继续您的工作。

    图 5. 可以随意中断与 Screen 的连接和重新连接

    可以随意中断与 Screen 的连接和重新连接

    如果您常常要访问远程服务器以执行维护或开发软件,那么 GNU Screen 是必不可少的工具。

    构建并安装 Screen

    Screen 的最初版本早在 10 多年前就发布了,所以您的系统上很可能有这个实用程序(通常名为 /usr/bin/screen)。但是,如果系统上没有 Screen,也很容易通过发行版的包管理器安装它。例如,如果您使用 Debian Linux® 的变体(比如 Ubuntu),那么可以用apt-get 简便地安装 Screen:

      $ sudo apt-get install screen

    另外,如果您喜欢从源代码构建软件,可以访问 GNU Screen 项目页面(见 参考资料 中的链接)并下载最新的代码包。在撰写本文时,Screen 的最新版本是 4.0.3,于 2008 年 8 月发布。下载并提取代码,进入生成的源代码目录,然后依次运行./configuremake 和sudo make install

    $ wget http://ftp.gnu.org/gnu/screen/screen-4.0.3.tar.gz
    $ tar xzf tar xzf screen-4.0.3.tar.gz 
    $ cd screen-4.0.3
    $ ./configure
    this is screen version 4.0.3
    ...
    $ make
    CPP="gcc -E " srcdir=. sh ./osdef.sh
    ...
    $ sudo make install
    ...
    You may also want to install ./etc/etcscreenrc in 
    	/usr/etc/screenrc.
    $ sudo cp ./etc/etcscreenrc /usr/etc/screenrc

    Screen 现在就安装好了,可以使用了。输入 man screen 查看 Screen 的手册页。

    开始使用 Screen

    启动 Screen。在出现许可协议消息时,按 Return;现在应该会看到一个新的登录 shell 提示。(在下面的清单中,在每个 shell 提示前面人为地添加一个昵称,以此区分各个 shell 实例并与图 1 到图 5 联系起来)。

    Local $ ssh remote.example.com 
    Last login: Sun Dec 21 17:23:16 2008 from local.example.com
    Remote $ hostname
    remote.example.com
    Remote $ screen
    A $ top

    现在处于 图 2 所示的状态。一个 Screen 会话正在运行(尽管看不到),窗口 A 处于活动状态,它正在运行系统监视器 top,每隔几秒刷新一次系统性能信息。

    为了临时断开与 Screen 会话及其所有窗口的连接,按 Ctrl-a,然后按 d(小写的字母 D,代表 “detach”)。Ctrl-a 是 Screen 命令的前缀,d 是用于断开连接的命令。现在处于图 3 所示的状态。Screen 会话和窗口 A 仍然存在。可以通过运行screen -list 确认这一点:

    $ screen -list
    There is a screen on:
    21020.pts-2.remote  (Detached)
    1 Socket in /tmp/screens/S-strike.

    screen -list 命令显示所有可用的 Screen 会话。(顺便说一句,可以同时运行多个 Screen 会话,每个会话有一组同时运行的窗口。图 6 显示这种情况。每个 Screen 实例跟踪它自己的当前窗口。稍后会提供一些关于 Screen 的高级用法的提示)。编号为21020 的会话已经断开连接并相应地加上了标志。因为只有一个 Screen 会话,所以可以直接用screen -r 重新连接它。由于运行了 Screen,top 会一直运行。

    图 6. Screen 提供多个会话,每个会话有多个窗口

    Screen 提供多个会话,每个会话有多个窗口

    为了进入 图 4 所示的状态,重新连接当前会话,然后按 Ctrl-a,然后按 c(小写的字母 C,代表 “create”)创建一个新窗口。接下来,按Ctrl-a,然后再次按c。现在,Screen 会话管理三个窗口。

    按 Ctrl-a,然后在当前窗口中按双引号键("),就可以看到会话中可用窗口的列表:

    Num  Name           Flags
    
     0   bash           $
     1   bash           $
     2   bash           $

    在默认情况下,窗口的名称取自它启动的第一个命令(通常是一个 shell)。因此,在上面的列表中有三个 bash 窗口。可以用箭头键在窗口列表中上下移动;只需按回车即可选择窗口。

    终止当前窗口的方法是,在窗口的 shell 提示上输入 exit,或者按键盘快捷键 Ctrl-a,然后按k(小写的字母 K,代表 “kill”)。如果使用后一种方法,那么在窗口底部会出现一个警告,要求您确认要杀死此窗口。按y(小写的字母 Y,代表 “yes”)确认,或按n(小写的字母 N,代表 “no”)拒绝。如果杀死一个 Screen 会话中运行的所有窗口,屏幕命令就会输出一个消息并终止:

    Remote $ screen
    ... Create and manipulate windows ...
    ... Exit from all windows...
    [screen is terminating]
    Remote $ screen -list
    No Sockets found in /tmp/uscreens/S-supergiantrobot.

    如果杀死了所有打开的窗口,那么 screen -list 命令输出 No sockets...,表示没有 Screen 会话可用。

    更智能化的屏幕

    到目前为止,已经看到了如何在一个 Screen 会话中创建多个窗口。只需这么做,就足以确保命令行工作不会丢失。

    但是坦率地说,由于同时运行多个看起来相同的窗口,管理时可能引起混乱。最好能够轻松地区分窗口,而不需要逐一打开每个窗口。如果在断开连接和重新连接之间间隔的时间比较长的话,这种特性尤其有意义。

    实际上,Screen 提供了许多选项和工具来帮助定制您的工作环境。可以给每个窗口指定名称,还可以在每个窗口的底部显示一个状态栏以帮助区分窗口。

    指定窗口名称的方法是,激活窗口,按 Ctrl-a A(大写的字母 A,代表 “Annotate”),根据需要按 Backspace 删除现有的名称,然后在提示上输入一个有意义的名称:

    Num  Name            Flags
    
     0   Window A       $
     1   Window B       $
     2   Window C       $

    在下如 中,窗口的标题被设置为 Window A。窗口的昵称不必是惟一的。

    图 7. 可以给每个窗口指定描述性的名称

    可以给每个窗口指定描述性的名称

    可以使用状态栏在视觉上进一步区分各个窗口。启动您喜欢的文本编辑器,在主目录中创建包含以下代码的 .screenrc 文件:

    hardstatus on
    hardstatus alwayslastline
    hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "

    创建这样的 .screenrc 配置文件之后,每个新窗口就会显示状态栏,其中包含窗口的名称。图 8 显示一个包含状态栏的窗口。

    图 8. 使用状态栏帮助识别每个窗口

    使用状态栏帮助识别每个窗口

    有帮助的 Screen 提示

    Screen 的特性非常多,无法在这里一一介绍。下面给出一些提示并介绍几个比较有用的选项,帮助您更顺畅地使用 Screen:

    • 在任何窗口中输入 screen,不带任何参数,就会打开一个新窗口。按 Ctrl-a,然后按c 与输入screen 的作用相同,差异只是后一种方式通过提供命令行选项立即配置新会话。
    • 可以使用 screen -t name 命令在创建窗口时指定窗口名称。例如,要想创建一个新窗口并把它命名为debugger,只需进入 Screen 管理的一个窗口,然后输入screen -t debugger。如果打开窗口列表,其中一个窗口的标签应该是debugger
    • 如果已经断开了与 Screen 会话的连接,可以用 screen -p ID 命令重新连接特定的窗口,其中的ID 是一个数字或名称。我们来试一下:
      Local $ ssh remote.example.com
      Remote $ screen -t ghost
      Ghost $ screen -t new
      New $ 
      ... Press Control-a d to detach...
      Remote $ screen -r -p ghost
      Ghost $
    • 可以用 screen -L 命令把每个窗口的输出记录在日志中。每个窗口有自己的日志文件,文件名通常是~/screenlog.n,其中的n 是窗口列表中显示的窗口编号。这个特性对于记录复杂的步骤(比如重新配置系统)非常有帮助。
    • 在 Screen 文档中记录了所有快捷键。最有用的组合键包括:按 Ctrl-a,然后按0(数字零)到9 立即切换到特定的窗口;按Ctrl-a,然后按C(大写的字母 C,代表 “Clear”)清除一个窗口的内容;按Ctrl-a,然后按H 启用或禁用日志记录;按 Ctrl-a,然后按Ctrl-a 在当前窗口和前一个窗口之间来回切换;按Ctrl-a,然后按Ctrl-(反斜杠)杀死所有窗口并终止当前的 Screen 会话。

    Screen 的高级用法

    正如前面提到的,可以创建多个同时运行的 Screen 会话,每个会话可以管理一系列窗口。每个会话有一个惟一标识符;使用 screen -list 列出可用的所有会话。与窗口一样,可以给会话指定名称以便引用它。使用screen -Slabel 给新会话分配标签。

    共享是 Screen 会话的最佳用法之一。如果允许,可以连接现有的会话并在此会话的任何窗口中与其他用户协作。甚至可以独立地切换到会话中的另一个窗口。如果您与其他用户在同一窗口中,输入或显示的任何内容都会反映给所有伙伴。我们来试一下:

    1. 选择一台工作计算机并登录。
    2. 输入 screen -S sharing -t one 创建一个名为 sharing 的 Screen 会话和一个名为one 的新窗口。
    3. 用 screen -t two 创建另一个窗口。
    4. 如果愿意,检查一下目前的状态:按 Ctrl-a,然后按 d,然后输入 screen -list 和screen -r sharing,然后按Ctrl-a,然后按"。
    5. 在 one 窗口中输入 echo,在此窗口中产生一些输出。
    6. 在同一台计算机上,打开第二个登录窗口。
    7. 在此窗口中,输入 screen -x -r sharing -p one

      -x 选项指定多用户模式;-p one 直接连接到 one 窗口。应该会马上看到与另一个登录会话相同的输出,见图 9。

      图 9. 可以共享会话
      可以共享会话

    在每个登录窗口中,运行 UNIX® 命令产生输出,按 Screen 快捷键在共享的会话中的窗口之间切换并查看结果。

    结束语

    要想进一步掌握 Screen,可以研究一下多屏幕模式,学习如何用老式的锁防止对各个窗口的访问。

    Screen 是一个很实用的工具,它对于在命令行上执行的任何工作都很有价值。实际上,一旦掌握了它,您就会觉得离不开它了。

    二、使用tmux管理会话

    介绍

    tmux是一个优秀的终端复用软件,即使非正常掉线,也能保证当前的任务运行,这一点对于远程SSH访问特别有用,网络不好的情况下仍然能保证工作现场不丢失!此外,tmux完全使用键盘控制窗口,实现窗口的切换功能。

    简单地说,tmux对于我主要有两个功能(这应该也是tmux的主要功能):

    1. split窗口。可以在一个terminal下打开多个终端,也可以对当前屏幕进行各种split,即可以 同时打开多个显示范围更小的终端。
    2. 在使用SSH的环境下,避免网络不稳定,导致工作现场的丢失。想象以下场景, 你在执行一条命令的过程中,由于网络不稳定,SSH连接断开了。这个时候,你就不知道之前 的那条命令是否执行成功。如果此时你打开了很多文件,进入了较深层次的目录,由于网络 不稳定,SSH连接断开。重新连接以后,你又不得不重新打开那些文件,进入那个深层次的 目录。如果使用了tmux,重新连接以后,就可以直接回到原来的工作环境,不但提高了工作 效率,还降低了风险,增加了安全性。

    安装

    sudo apt-get install tmux

    安装完成后输入命令tmux即可打开软件,界面十分简单,类似一个下方带有状态栏的终端控制台;不出意外,这时候你会跟我第一次一样,觉得tmux没什么牛逼的。

    会话,窗口,面板

    根据tmux的定义,在开启了tmux服务器后,会首先创建一个会话,而这个会话则会首先创建一个窗口,其中仅包含一个面板;也就是说,这里看到的所谓终端控制台应该称作tmux的一个面板,虽然其使用方法与终端控制台完全相同。

    tmux使用C/S模型构建,主要包括以下单元模块:

    • server服务器。输入tmux命令时就开启了一个服务器。
    • session会话。一个服务器可以包含多个会话
    • window窗口。一个会话可以包含多个窗口。
    • pane面板。一个窗口可以包含多个面板。

    初体验

    我们先来看一张效果图,再来学习tmux的配置和使用我一般都是这么用,因为我的笔记本只有13寸:-)

    tmux-small

    当然,做为一个准IT男,我还有一个很大的屏幕,所以我偶尔也这么用:

    tmux-large

    你所看到的只是X个会话中的一个会话,且是该会话下面的Y个窗口中的一个窗口。是的,你在一个窗口里就可以拥有这么多个终端,这就是tmux的主要功能。好了,下面是tmux的常用按键,你先自己玩一下再往下看吧。

    常用按键

    这里需要说明一点的是,tmux的任何指令,都包含一个前缀,也就是说,你按了前缀(一组按键,默认是Ctrl+b)以后,系统才知道你接下来的指令是发送给tmux的。

    • C-b ? 显示快捷键帮助
    • C-b C-o 调换窗口位置,类似与vim 里的C-w
    • C-b 空格键 采用下一个内置布局
    • C-b ! 把当前窗口变为新窗口
    • C-b " 模向分隔窗口
    • C-b % 纵向分隔窗口
    • C-b q 显示分隔窗口的编号
    • C-b o 跳到下一个分隔窗口
    • C-b 上下键 上一个及下一个分隔窗口
    • C-b C-方向键 调整分隔窗口大小
    • C-b c 创建新窗口
    • C-b 0~9 选择几号窗口
    • C-b c 创建新窗口
    • C-b n 选择下一个窗口
    • C-b l 切换到最后使用的窗口
    • C-b p 选择前一个窗口
    • C-b w 以菜单方式显示及选择窗口
    • C-b t 显示时钟
    • C-b ; 切换到最后一个使用的面板
    • C-b x 关闭面板
    • C-b & 关闭窗口
    • C-b s 以菜单方式显示和选择会话
    • C-b d 退出tumx,并保存当前会话,这时,tmux仍在后台运行,可以通过tmux attach进入 到指定的会话

    配置

    我们先来看一下几个配置,这些配置才是我离不开tmux的原因:-)。tmux的配置文件是~/.tmux.conf,这个文件可能不存在,你可以自己新建。下面开始配置,首先,有没有觉得tmux的前缀按起来太不方便了,ctrl与b键隔得太远,很多人把它映射成C+a,也就是在配置文件(~/.tmux.conf)中加入下面这条语句:

    1.  
      #设置前缀为Ctrl + a
    2.  
      set -g prefix C-a

    与此同时,取消默认的前缀按键:

    1.  
      #解除Ctrl+b 与前缀的对应关系
    2.  
      unbind C-b

    配置完以后,重启tmux起效,或者先按C+b,然后输入,进入命令行模式,在命令行模式下输入:

    source-file ~/.tmux.conf

    你也可以跟我一样,在配置文件中加入下面这句话,以后改了只需要按前缀+r了。

    1.  
      #将r 设置为加载配置文件,并显示"reloaded!"信息
    2.  
      bind r source-file ~/.tmux.conf ; display "Reloaded!"

    关于前缀,很多人都喜欢改成Ctrl+a,不过我个人更喜欢Ctrl+x,如果你是vim用户,你一定懂的。还有就是面板的切换很不方便,需要先按前缀,再按方向键,还记得vim里面怎么切换各个面板的吗?tmux也可以,因为它支持映射。把前缀映射改成Ctrl+x,再加入如下几条语句,现在切换窗口就和vim一摸一样了,顿时觉得亲切了很多。

    1.  
      #up
    2.  
      bind-key k select-pane -U
    3.  
      #down
    4.  
      bind-key j select-pane -D
    5.  
      #left
    6.  
      bind-key h select-pane -L
    7.  
      #right
    8.  
      bind-key l select-pane -R

    上面的最后一条语句会更改C-x l的功能,我挺喜欢这个功能的,因为我们很时候都是在两个窗口或这两个面板中切换,所以我又加入如下语句

    1.  
      #select last window
    2.  
      bind-key C-l select-window -l

    现在我的l键可不能随便按了,Ctrl+x l是切换面板,Ctrl+x Ctrl+l切换窗口,Ctrl+l清屏。

    复制模式copy-mode

    • 前缀 [ 进入复制模式
    • 按 space 开始复制,移动光标选择复制区域
    • 按 Enter 复制并退出copy-mode。
    • 将光标移动到指定位置,按 PREIFX ] 粘贴

    如果把tmux比作vim的话,那么我们大部分时间都是处于编辑模式,我们复制的时候可不可以像vim一样移动呢?只需要在配置文件(~/.tmux.conf)中加入如下行即可。

    1.  
      #copy-mode 将快捷键设置为vi 模式
    2.  
      setw -g mode-keys vi

    会话

    • C-x s 以菜单的方式查看并选择会话
    • C-x :new-session 新建一个会话
    • C-x d 退出并保存会话
    • 终端运行 tmux attach 返回会话

    命名会话

    1.  
      tmux new -s session
    2.  
      tmux new -s session -d #在后台建立会话
    3.  
      tmux ls #列出会话
    4.  
      tmux attach -t session #进入某个会话

    使当前pane 最大化

    从我用vim开始,就相信这世界上有些人比你自己还了解你自己想要什么,所以乔老爷子才能做出让世人尖叫的产品,所以我经常浏览高手的.vimrc文件,我用了tmux不到3天就发现,它怎么不能最大化当前pane?就像vim里的ZommWinPlugin.vim插件一样,你按下某键,当前窗口就最大化了,获得最大可视界面。当目前为止,就还没有发现我有需求而别人没有的,同样,已有前人找到的解决办法,方法如下:

    1.  
      # zoom pane <-> window
    2.  
      #http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/examples/tmux-zoom.sh
    3.  
      bind ^z run "tmux-zoom"
    4.  
      ##

    滚屏

    滚屏要进入copy-mode,即前缀+[,然后就可以用上下键来滚动屏幕,配置了vi快捷键模式,就可以像操作vi一样来滚动屏幕,非常的方便。退出直接按‘q’键即可。

    其他配置

    下面是从别人那里摘录过来的配置,反正我是用不着,留着以后参考吧,或许屏幕前的你有需要呢。

    1.  
      #
    2.  
      # author : Xu Xiaodong <xxdlhy@gmail.com>
    3.  
      # modified : 2012 Jul 22
    4.  
      #
    5.  
       
    6.  
      #-- base settings --#
    7.  
      set -g default-terminal "screen-256color"
    8.  
      set -g display-time 3000
    9.  
      set -g escape-time 0
    10.  
      set -g history-limit 65535
    11.  
      set -g base-index 1
    12.  
      set -g pane-base-index 1
    13.  
       
    14.  
      #-- bindkeys --#
    15.  
      # prefix key (Ctrl+a)
    16.  
      set -g prefix ^a
    17.  
      unbind ^b
    18.  
      bind a send-prefix
    19.  
       
    20.  
      # split window
    21.  
      unbind '"'
    22.  
      # vertical split (prefix -)
    23.  
      bind - splitw -v
    24.  
      unbind %
    25.  
      bind | splitw -h # horizontal split (prefix |)
    26.  
       
    27.  
      # select pane
    28.  
      bind k selectp -U # above (prefix k)
    29.  
      bind j selectp -D # below (prefix j)
    30.  
      bind h selectp -L # left (prefix h)
    31.  
      bind l selectp -R # right (prefix l)
    32.  
       
    33.  
      # resize pane
    34.  
      bind -r ^k resizep -U 10 # upward (prefix Ctrl+k)
    35.  
      bind -r ^j resizep -D 10 # downward (prefix Ctrl+j)
    36.  
      bind -r ^h resizep -L 10 # to the left (prefix Ctrl+h)
    37.  
      bind -r ^l resizep -R 10 # to the right (prefix Ctrl+l)
    38.  
       
    39.  
      # swap pane
    40.  
      # swap with the previous pane (prefix Ctrl+u)
    41.  
      bind ^u swapp -U
    42.  
      # swap with the next pane (prefix Ctrl+d)
    43.  
      bind ^d swapp -D
    44.  
       
    45.  
      # misc
    46.  
      # select the last pane (prefix e)
    47.  
      bind e lastp
    48.  
      # select the last window (prefix Ctrl+e)
    49.  
      bind ^e last
    50.  
      # kill pane (prefix q)
    51.  
      bind q killp
    52.  
      # kill window (prefix Ctrl+q)
    53.  
      bind ^q killw
    54.  
       
    55.  
      # copy mode
    56.  
      # enter copy mode (prefix Escape)
    57.  
      bind Escape copy-mode
    58.  
      # paste buffer (prefix Ctrl+p)
    59.  
      bind ^p pasteb
    60.  
      # select (v)
    61.  
      bind -t vi-copy v begin-selection
    62.  
      # copy (y)
    63.  
      bind -t vi-copy y copy-selection
    64.  
       
    65.  
      # zoom pane <-> window
    66.  
      #http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/examples/tmux-zoom.sh
    67.  
      bind ^z run "tmux-zoom"
    68.  
       
    69.  
      # app
    70.  
      # htop (prefix !)
    71.  
      bind ! splitw htop
    72.  
      # man (prefix m)
    73.  
      bind m command-prompt "splitw 'exec man %%'"
    74.  
      # perl func (prefix @)
    75.  
      bind @ command-prompt "splitw 'exec perldoc -t -f %%'"
    76.  
      # perl var (prefix *)
    77.  
      bind * command-prompt "splitw 'exec perldoc -t -v %%'"
    78.  
      # perl doc (prefix %)
    79.  
      bind % command-prompt "splitw 'exec perldoc -t %%'"
    80.  
      # ruby doc (prefix /)
    81.  
      bind / command-prompt "splitw 'exec ri %%'"
    82.  
       
    83.  
      # reload config (prefix r)
    84.  
      bind r source ~/.tmux.conf ; display "Configuration reloaded!"
    85.  
       
    86.  
      #-- statusbar --#
    87.  
      set -g status-utf8 on
    88.  
      set -g status-interval 1
    89.  
      set -g status-keys vi
    90.  
       
    91.  
      setw -g mode-keys vi
    92.  
      setw -g automatic-rename off
    93.  
       
    94.  
      #-- colorscheme --#
    95.  
      #https://github.com/daethorian/conf-tmux/blob/master/colors/zenburn.conf
    96.  
       
    97.  
      # modes
    98.  
      setw -g clock-mode-colour colour223
    99.  
      setw -g mode-attr bold
    100.  
      setw -g mode-fg colour223
    101.  
      setw -g mode-bg colour235
    102.  
       
    103.  
      # panes
    104.  
      set -g pane-border-bg colour234
    105.  
      set -g pane-border-fg colour234
    106.  
      set -g pane-active-border-bg colour232
    107.  
      set -g pane-active-border-fg colour232
    108.  
       
    109.  
      # statusbar
    110.  
      set -g status-justify centre
    111.  
      set -g status-bg colour235
    112.  
      set -g status-fg colour248
    113.  
      set -g status-attr dim
    114.  
      #[default]» #[fg=colour187]#S #[default]• #[fg=colour187]w#I.p#P#[default]"
    115.  
      set -g status-left "
    116.  
      set -g status-left-attr bright
    117.  
      set -g status-left-length 20
    118.  
      #[fg=colour174]#(/home/xiaodong/bin/uptime) #[default]• #[fg=colour174]#(cut -d ' ' -f 1-3 /proc/loadavg)"
    119.  
      set -g status-right "
    120.  
      set -g status-right-attr bright
    121.  
      set -g status-right-length 80
    122.  
       
    123.  
      setw -g window-status-current-fg colour223
    124.  
      setw -g window-status-current-bg colour237
    125.  
      setw -g window-status-current-attr bold
    126.  
      setw -g window-status-current-format "#I:#W#F"
    127.  
       
    128.  
      #setw -g window-status-alert-attr bold
    129.  
      #setw -g window-status-alert-fg colour255
    130.  
      #setw -g window-status-alert-bg colour160
    131.  
       
    132.  
      # messages
    133.  
      set -g message-attr bold
    134.  
      set -g message-fg colour223
    135.  
      set -g message-bg colour235

    set -g visual-activity on

    快速启动tmux

    如果觉得每次都要打开tmux,然后在打开几个窗口和面板很麻烦,那么下面这个脚本你一定会喜欢。参考这里

    1.  
      #!/bin/sh
    2.  
      #
    3.  
      # name : tmuxen, tmux environment made easy
    4.  
      # author : Xu Xiaodong xxdlhy@gmail.com
    5.  
      # license : GPL
    6.  
      # created : 2012 Jul 01
    7.  
      # modified : 2012 Jul 02
    8.  
      #
    9.  
       
    10.  
      cmd=$(which tmux) # tmux path
    11.  
      session=codefun # session name
    12.  
       
    13.  
      if [ -z $cmd ]; then
    14.  
      echo "You need to install tmux."
    15.  
      exit 1
    16.  
      fi
    17.  
       
    18.  
      $cmd has -t $session
    19.  
       
    20.  
      if [ $? != 0 ]; then
    21.  
      $cmd new -d -n vim -s $session "vim"
    22.  
      $cmd splitw -v -p 20 -t $session "pry"
    23.  
      $cmd neww -n mutt -t $session "mutt"
    24.  
      $cmd neww -n irssi -t $session "irssi"
    25.  
      $cmd neww -n cmus -t $session "cmus"
    26.  
      $cmd neww -n zsh -t $session "zsh"
    27.  
      $cmd splitw -h -p 50 -t $session "zsh"
    28.  
      $cmd selectw -t $session:5
    29.  
      fi
    30.  
       
    31.  
      $cmd att -t $session
    32.  
       
    33.  
      exit 0

    如果还有其他需要,可以去这里看看,当然了,最全的参考文档,就是man tmux。happy tmux!

    个性化折腾

    生命不息,折腾不止.自己定制的才是最适合自己的,如此强大的工具要慢慢挖掘1. 改prefix键, ctrl+b没手感,改为ctrl+h修改~/.tmux.conf(如果没有则新建一个),新增如下内容:
    set -g prefix C-hunbind-key C-b

    1. 启动shell时自动进入tmux, 如果没有会话则新建一个,有则直接attach在.zshrc(bash用户可能是.bashrc)的最后加入tmux就直接启动了,但要做些逻辑判断最后的脚本如下:
      test -z "$TMUX" && (tmux attach || tmux new-session)

    2. 定制状态栏, 想在状态栏上加点自己随时感兴趣的东西因为是动态IP,平常时不时会要ifconfig一下,于是将IP固定显示在状态栏左边
      set -g status-left-ength 21set -g status-left "#[bg=green,fg=white,bold]#(ifconfig | grep -A1 eth0 | tail -1 | awk '{print $2}' | awk -F: '{print $2}')"开发的机器经常高load,可以将load放到状态栏右边,成天对着黑白terminal,怕忘记时间再在状态栏加上时间显示(一分钟refresh一次)
      set -g status-right "#[bg=green,fg=white,bold]#(cut -d ' ' -f 1-3 /proc/loadavg) ● #[bg=green,fg=white,bold]#(date +%H:%M)"set -g status-interval 60(其实在tmux中, 按下prefix键后 加t 会有个全屏的时钟出来)

    3. 启动时初始化窗口想骚包吗?想假装高手吗,想打开tmux就自动就分N个窗口吗?在shell启动脚本中加入这些(替换之前的自启动脚本)

    使用以上脚本会开两个window,并把第2个window分割成3份,最上面跑着htop,左边有个vim,右边一个dstat,效果如下图 
    all 
    具体需要启动什么,启动几个窗口,分割分几个pane, 都可以修改脚本定制

    1. 多pane同步连了好几台服务器,想同时执行相同的命令,同时观察结果吗?在按下prefix键后按冒号进入command模式输入 
      setw synchronize-panes 
      你输入的命令将在所有pane中出现执行 
      syn-pane

    把以下脚本内容加入到~/.bashrc,即可每次登录进入到tmux

    1.  
      tmux_init()
    2.  
      {
    3.  
      tmux new-session -s "kumu" -d -n "local" # 开启一个会话
    4.  
      tmux new-window -n "other" # 开启一个窗口
    5.  
      tmux split-window -h # 开启一个竖屏
    6.  
      tmux split-window -v "top" # 开启一个横屏,并执行top命令
    7.  
      tmux -2 attach-session -d # tmux -2强制启用256color,连接已开启的tmux
    8.  
      }
    9.  
      # 判断是否已有开启的tmux会话,没有则开启
    10.  
      if which tmux 2>&1 >/dev/null; then
    11.  
      test -z "$TMUX" && (tmux attach || tmux_init)
    12.  
      fi

    三、配置文件

    ~/.screenrc

    1.  
      hardstatus alwayslastline
    2.  
      hardstatus string "%{= B}:%{= b}: %{= r}[ %{G}%H%{= r} ] %= %{=b b}%-w%{=rb db}%>%n %t%{-}%+w %=%{= r}[ %{G}%c %{M}%D %m-%d %{r}] %{= b}:%{B}:"
    3.  
      terminfo xterm*|rxvt ti@:te@
    4.  
      terminfo rxvt-unicode 'Co#256:AB=E[48;5;%dm:AF=E[38;5;%dm'
    5.  
      terminfo xterm* 'XT:hs:ts=E]2;:fs=07:ds=E]2;screen07'
    6.  
      autodetach on # default: on
    7.  
      altscreen on
    8.  
      defscrollback 1000
    9.  
      msgwait 5
    10.  
      msgminwait 2
    11.  
      pow_detach_msg "Screen session of $LOGNAME $:cr:$:nl:ended."
    12.  
      startup_message off # default: on
    13.  
      vbell off
    14.  
      vbell_msg " Wuff ---- Wuff!! "
    15.  
      nethack on
    16.  
      defutf8 on
    17.  
      shell /bin/zsh
    18.  
      bindkey -k F1 prev
    19.  
      bindkey -k F2 next
    20.  
      screen
    21.  
      screen

    ~/.tmux.conf

    1.  
      set-option -g prefix C-a
    2.  
      unbind-key C-b
    3.  
      bind-key C-a send-prefix
    4.  
      bind-key -n F11 previous-window
    5.  
      bind-key -n F12 next-window
    6.  
      bind-key C-c new-window
    7.  
      setw -g mode-keys vi
    8.  
      setw -g xterm-keys on
    9.  
      unbind %
    10.  
      bind | split-window -h
    11.  
      bind h split-window -h
    12.  
      unbind '"'
    13.  
      bind - split-window -v
    14.  
      bind v split-window -v
    15.  
      set-option -g visual-activity on
    16.  
      setw -g monitor-activity on
    17.  
      setw -g automatic-rename off
    18.  
      setw -g utf8 on
    19.  
      set -g base-index 1
    20.  
      set -g terminal-overrides "*88col*:colors=88,*256col*:colors=256,xterm*:colors=256"
    21.  
      set -g default-terminal "screen-256color"
    22.  
      set -g status-utf8 on
    23.  
      set -g status-justify centre
    24.  
      set -g status-bg default
    25.  
      set -g status-left "#[fg=cyan]:#[fg=blue]: #[fg=red][ #[fg=green]#H #[fg=red]]#[default]"
    26.  
      set -g status-left-length 20
    27.  
      set -g status-right-length 25
    28.  
      set -g status-right "#[fg=red][ #[fg=green]%H:%M #[fg=magenta]%a %m-%d #[fg=red]] #[fg=blue]:#[fg=cyan]:#[default]"
    29.  
      setw -g window-status-format '#[fg=blue,bold]#I #T#[default] '
    30.  
      setw -g window-status-current-format '#[fg=blue,bold,reverse]#I #T#[default] '
    31.  
      #setw -g window-status-alert-fg red
    1.  
      # author: XuTao <butbueatiful@gmail.com>
    2.  
      # time: Sun Jul 15 21:57:17 CST 2012
    3.  
      # Usage: mv tmux_conf.txt ~/.tmux.conf
    4.  
      #------------------------------------------
    5.  
       
    6.  
      #-- base --#
    7.  
      set -g default-terminal "screen"
    8.  
      set -g display-time 3000
    9.  
      set -g history-limit 65535
    10.  
      #----------------------------------------------
    11.  
       
    12.  
      #将默认按键前缀改为与C-i避免与终端快捷键冲突
    13.  
       
    14.  
      set-option -g prefix C-i
    15.  
      unbind-key C-b
    16.  
      bind-key C-i send-prefix
    17.  
      #----------------------------------------------
    18.  
       
    19.  
      #按键绑定
    20.  
       
    21.  
       
    22.  
      #水平或垂直分割窗口 (C+A+ :split-window + v/h)
    23.  
      unbind '"'
    24.  
      bind - splitw -v #分割成上下两个窗口
    25.  
      unbind %
    26.  
      bind | splitw -h #分割成左右两个窗口
    27.  
      #----------------------------------------------
    28.  
       
    29.  
      #选择分割的窗格
    30.  
      bind k selectp -U #选择上窗格
    31.  
      bind j selectp -D #选择下窗格
    32.  
      bind h selectp -L #选择左窗格
    33.  
      bind l selectp -R #选择右窗格
    34.  
      #----------------------------------------------
    35.  
       
    36.  
      #重新调整窗格的大小
    37.  
      bind ^k resizep -U 10
    38.  
      bind ^j resizep -D 10
    39.  
      bind ^h resizep -L 10
    40.  
      bind ^l resizep -R 10
    41.  
      #----------------------------------------------
    42.  
       
    43.  
      #交换两个窗格
    44.  
      bind ^u swapp -U
    45.  
      bind ^d swapp -D
    46.  
       
    47.  
      bind ^a last
    48.  
      bind q killp
    49.  
      #----------------------------------------------
    50.  
       
    51.  
      bind '~' splitw htop
    52.  
      bind ! splitw ncmpcpp
    53.  
      bind m command-prompt "splitw -h 'exec man %%'"
    54.  
       
    55.  
      unbind s
    56.  
      #----------------------------------------------
    57.  
       
    58.  
      #定制状态行
    59.  
       
    60.  
      set -g status-left "#[fg=white,bg=blue] > #I < #[default] |" # 0:bash
    61.  
      #set -g status-left "#[fg=white,bg=blue] > #I < #[default] |" # session-name
    62.  
      set -g status-right "#[fg=yellow,bright][ #[fg=cyan]#W #[fg=yellow]]#[default] #[fg=yellow,bright]- %Y.%m.%d #[fg=green]%H:%M #[default]"
    63.  
      set -g status-right-attr bright
    64.  
       
    65.  
      set -g status-bg black
    66.  
      set -g status-fg white
    67.  
      set -g set-clipboard on
    68.  
       
    69.  
      setw -g window-status-current-attr bright
    70.  
      #setw -g window-status-current-bg red
    71.  
      setw -g window-status-current-bg green
    72.  
      setw -g window-status-current-fg white
    73.  
       
    74.  
      set -g status-utf8 on
    75.  
      set -g status-interval 1
    76.  
       
    77.  
      #set -g visual-activity on
    78.  
      #setw -g monitor-activity on
    79.  
       
    80.  
      set -g status-keys vi
    81.  
      #----------------------------------------------
    82.  
       
    83.  
      setw -g mode-keys vi
    84.  
      setw -g mode-mouse on
    85.  
       
    86.  
      #setw -g mouse-resize-pane on
    87.  
      #setw -g mouse-select-pane on
    88.  
      #setw -g mouse-select-window on
    89.  
       
    90.  
      # move x clipboard into tmux paste buffer
    91.  
      bind C-p run "tmux set-buffer "$(xclip -o -sel clipbaord)"; tmux paste-buffer"
    92.  
      # move tmux copy buffer into x clipboard
    93.  
      bind C-y run "tmux show-buffer | xclip -i -sel clipbaord"
    94.  
       
    95.  
      #默认启动应用
    96.  
       
    97.  
      #new -s work # 新建名为 work 的会话,并启动 mutt
    98.  
      #neww rtorrent # 启动 rtorrent
    99.  
      #neww vim # 启动 vim
    100.  
      #neww zsh
    101.  
      #selectw -t 3 # 默认选择标号为 3 的窗口

    参考:

    http://kumu-linux.github.io/blog/2013/08/06/tmux/

    http://www.lovelin.info/blog/2012/10/25/tmuxshi-yong-xin-de-xiao-ji/

    http://kumu-linux.github.io/blog/2013/08/06/tmux/

  • 相关阅读:
    Dynamics AX
    专注于领域驱动设计的研究与实践系列转载
    在C#里使用属性,如Obsolete,Serializable,XmlRoot
    SQL 2005 with(nolock)详解
    Microsoft Domain Oriented NLayered .NET 4.0 App Sample (DDD Architecture)
    使用 .NET4 中的Task优化线程池【.NET4 多核并行】
    实现简单DTO适配器,解放你的双手
    最强悍的VS插件—reSharper
    通过代码配置 Log4net
    Microsoft NLayerApp案例理论与实践–DDD、分布式DDD及其分层【转】
  • 原文地址:https://www.cnblogs.com/develon/p/10050926.html
Copyright © 2011-2022 走看看