zoukankan      html  css  js  c++  java
  • GNU Screen使用入门

    前些天开始学习使用GNU Screen程序,发现这个工具在管理服务器时候确实挺方便的,于是写一篇文章总结一下,顺便介绍Screen的基本使用方法。

    简介

    GNU Screen是 一个基于文本的全屏窗口管理器,一个Screen会话可以在一个物理终端上模拟多个窗口,每个窗口中可以运行不同的进程。Screen一个典型的应用就是 在其创建的虚拟终端窗口中运行交互性的Shell程序,例如bash,这样就可以在一个终端上打开多个bash进行不同的操作了。

    举个例子,你可以使用SSH登录到你的服务器,然后打开一个Screen会话,使用它创建多个窗口。每个窗口都有一个独立的bash,然后就可以在 同一个SSH会话中进行不同的操作,譬如一个窗口编译,一个窗口写代码,另一个窗口挂着IRC,每个窗口内的进程都是独立的,还可以在这些窗口直接随意切 换。Screen为每个窗口都保存回滚历史,而且你还可以在不同的窗口中进行复制粘贴等操作。当然Screen的功能远不止多窗口这么简单,下面我对这个 强大的程序进行一下简单的介绍,虽然不会很全面,但也可以拿来入门。关于Screen程序更多的功能当然还是在它的帮助手册里和Google上了。

    安装和启动

    Screen这么著名的程序,Linux各种发行版自然都有,实在没有也有源代码下载,反正我的Fedora和CentOS是没有必要自己编译了:

    yum install screen

    就是这么简单。

    安装完成后,直接敲命令screen就可以启动它。但是这样启动的screen会话没有名字,实践上推荐为每个screen会话取一个名字,方便分辨:

    screen -S session_name

    Screen启动后,会创建第一个窗口,也就是窗口No. 0,并在其中打开一个系统默认的shell,一般都会是bash。所以你敲入命令screen之后,会立刻又返回到命令提示符,仿佛什么也没有发生似的, 其实你已经进入Screen的世界了。当然,也可以在screen命令之后加入你喜欢的参数,使之直接打开你指定的程序,例如:

    screen python
    screen vi foo.c

    这两个命令一个直接启动python的交互窗口,另一个打开vi编辑foo.c这个文件。

    查看帮助

    Screen程序使用Ctrl+a(缩写做C-a)作为其快捷键的前缀。快捷键C-a ?可以用来查看Screen的一个帮助页面,,也就是先同时按下Ctrl和a,然后按?。

    Emacs和bash中,C-a快捷键用于回到行首。但是在Screen中,C-a就会被Screen吞掉而无法直接发送给Emacs或bash。 要在 Emacs或者bash等程序中使用C-a,只需要按C-a a,这个快捷键把C-a本身发送给Screen中运行的程序,避免快捷键的冲突。

    使用多窗口

    创建窗口

    启动Screen以后,可以在任何需要的时候打开一个新的窗口,新窗口中可以运行新的程序,完全不影其他窗口中程序的运行。创建窗口快捷键是C-a c。新窗口创建后就会直接跳转到其中,窗口里默认会打开新的shell,你可以在这个新的shell中进行其他的操作。

    还有另一种创建窗口的方法,就是在Screen会话的一个Shell窗口中运行screen命令。听起来有点绕,其实就是如果你已经在一个 Screen会话中了,那么再在其中命令screen,不会递归地在其中产生新的Screen会话,而是会在已有的Screen会话中创建一个新的窗口。 有了这个方法,就可以像启动Screen会话时一样,直接指定新窗口中运行的程序了。

    关闭或杀死窗口

    正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。

    如果一个Screen会话中最后一个窗口被关闭了,那么整个Screen会话也就退出了,screen进程会被终止。

    查看窗口和窗口命名

    打开多个窗口后,可以使用快捷键C-a w列出当前所有窗口。如果使用文本终端,这个列表会列在屏幕左下角,如果使用X环境下的终端模拟器,这个列表会列在标题栏里。窗口列表的样子一般是这样:

    0$ bash  1$ bash  2$ bash  3-$ bash  4*$ bash

    这个例子中我开启了五个窗口,其中*号表示当前位于窗口4,-号表示上一次切换窗口时位于窗口3。

    也可以使用C-a “来查看当前Screen程序中的所有窗口,这个快捷键会将所有窗口在单独一个屏幕上列出来,可以使用vi-like的快捷键j和k在窗口之间选择,回车进入所选窗口。

    Screen默认会为窗口命名为编号和窗口中运行程序名的组合,上面的例子中窗口都是默认名字。练习了上面查看窗口的方法,你可能就希望各个窗口可 以有不同的名字以方便区分了。可以使用快捷键C-a A来为当前窗口重命名,按下快捷键后,Screen会允许你为当前窗口输入新的名字,回车确认。

    在窗口之间切换

    在Screen会话中,可以很方便的在各个窗口之间进行切换。下面总结几个常用的切换快捷键:

    • C-a C-a: 切换到上次所在的窗口,这个快捷键可以用于在两个窗口之间快速切换;
    • C-a <number>: 切换到第<number>个窗口,<number>只能是0到9之间的数字;
    • C-a ‘ <number or name>: 切换到第<number>或者名字是<name>的窗口;
    • C-a n or C-a <space>: 按顺序切换到下一个窗口;
    • C-a p or C-a <backspace>: 按顺序切换到上一个窗口。

    当然,上一小节的C-a “快捷键,可以列出当前会话中的窗口,也可以实现切换到指定窗口的功能。

    会话操作

    会话分离和恢复

    Screen一个比较强大也比较实用的功能,就是可以分离和恢复会话(Detaching/Reattaching)。设想这样的情况,你在实验室 的机器上打开Screen,在其中一个窗口里写代码,另一个窗口里编译一个大工程,比如Linux内核。然后十点半要封楼了,楼管大爷催你回寝室。如果不 是在Screen中工作的话,那么你可能需要退出正在写代码的编辑器,而且回寝室远程登录到实验室机器以后,还要通过PS等其他非常手段查看编译是否完成 了。

    有了Screen,就可以从容多了,只需按下C-a d,然后关闭显示器就可以回寝室去了。这个快捷键将当前终端与其中的Screen会话分离开,这个Screen会话的状态就变成了”detached”。 此外,还可以使用C-a D D快捷键,将当前终端与Screen分离后,还会直接退出当前终端上的登录。回到寝室后,再用SSH登录实验室主机,命令:

    screen -r

    就可以看到你之前在实验室看到的Screen会话了,所有的窗口都是离开前留下的状态。

    上述Reattach命令没有指定恢复哪个Screen会话,如果同一个Linux用户打开了多个Screen会话,则可以通过制定会话名称来恢复。首先,下面命令可以查看属于当前用户的所有Screen会话:

    screen -ls

    这个命令有类似下面的输出:

    There are screens on:
            14715.second    (Detached)
            14588.first     (Detached)
    2 Sockets in /var/run/screen/S-yuliang.

    其中每个会话的都由其PID和名称来标识,可以通过指定PID或名称来恢复指定的Screen会话:

    screen -r 14715
    screen -r first

    当然,如果你在实验室没有分离一个Screen会话,就无从恢复会话了。这时可以使用下面命令强制将这个会话从它所在的终端分离,转移到新的终端上来:

    screen -d
    screen -r

    或者可以直接命令:

    screen -dRR

    也可以一次性完成上述Detach+Reattach的工作。

    会话共享

    还有一种比较好玩的会话恢复,可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个Screen会话,你朋友可以在他的终端上命令:

    screen -x

    这个命令会将你朋友的终端Attach到你的Screen会话上,并且你的终端不会被Detach。这样你就可以和朋友共享同一个会话了,如果你们 当前又处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到这个会话的不 同窗口中去,那还是可以分别进行不同的操作的。

    会话锁定和解锁

    Screen允许使用快捷键C-a s锁定会话。锁定以后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但你的输入都会被Screen中的进程接收到。快捷键C-a q可以解锁一个会话。

    也可以使用C-a x锁定会话,不同的是这样锁定之后,会话会被Screen所属用户的密码保护,需要输入密码才能继续访问这个会话。

    发送命令到Screen会话

    在Screen会话之外,可以通过screen命令操作一个Screen会话,这也为使用Screen作为脚本程序增加了便利。关于Screen在脚本中的应用超出了入门的范围,这里只看一个例子,体会一下在会话之外对Screen的操作:

    screen -S session_name -X screen ping gnailuy.com

    这个命令在一个叫做session_name的Screen会话中创建一个新窗口,并在其中运行ping命令。

    退出Screen会话

    除 了依次退出/杀死当前Screen会话中所有窗口这种方法之外,还可以使用快捷键C-a :,然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序。其实C-a :这个快捷键允许用户直接输入的命令有很多,包括分屏可以输入split等,这也是实现Screen功能的一个途径,不过个人认为还是快捷键比较方便些。

    屏幕分割

    现在显示器那么大,将一个屏幕分割成不同区域显示不同的Screen窗口显然是个很酷的事情。可以使用快捷键C-a S将显示器水平分割,Screen 4.00.03版本以后,也支持垂直分屏,快捷键是C-a |。分屏以后,可以使用C-a <tab>在各个区块间切换,每一区块上都可以创建窗口并在其中运行进程。

    可以用C-a X快捷键关闭当前焦点所在的屏幕区块,也可以用C-a Q关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭,还可以通过窗口切换找到它。

    C/P模式和操作

    复制和粘贴

    Screen的另一个很强大的功能就是可以在不同窗口之间进行复制粘贴了。使用快捷键C-a <Esc>或者C-a [可以进入copy/paste模式,这个模式下可以像在vi中一样移动光标,并可以使用空格键设置标记。其实在这个模式下有很多类似vi的操作,譬如使 用/进行搜索,使用y快速标记一行,使用w快速标记一个单词等。关于C/P模式下的高级操作,其文档的这一部分有比较详细的说明。

    一般情况下,可以移动光标到指定位置,按下空格设置一个开头标记,然后移动光标到结尾位置,按下空格设置第二个标记,同时会将两个标记之间的部分储 存在copy/paste buffer中,并退出copy/paste模式。在正常模式下,可以使用快捷键C-a ]将储存在buffer中的内容粘贴到当前窗口。

    查看各个窗口的历史

    使用Screen时,每个虚拟终端的历史输出都会显示在物理终端的回滚缓冲中,因此使用物理终端自带的回滚功能会查看到不同窗口中内容的混杂。 Screen为每个虚拟终端都设有有自己的回滚缓冲,其实在上面提到的copy/paste模式中,就可以查看到一个窗口单独的缓冲。

    监视窗口中的活动

    使用Screen时,可以将编译放在后台窗口,然后在其他窗口进行其他工作。如果编译耗时很长,那么可以使用Screen的监视功能,在编译完成 后,窗口不再活动后,为我们做出提示。可以使用C-a _快捷键监视一个窗口,如果这个窗口超过30秒没有任何活动,就为用户做出提示。

    相反的,可以使用C-a M监视一个窗口,如果这个窗口有活动,为用户做出提示。这个功能可以用于监视IRC频道是否有新的谈话等。

    配置文件

    同大多数UNIX程序一样,GNU Screen的另一个强大之处,在于其灵活强大的的配置文件。配置文件一般位于用户家目录,文件名是.screenrc。在配置文件中可以进行许多自由灵 活的配置,来实现更大程度的个性化。由于本文是入门文章,就不涉及太多高深的话题,而且Screen的默认配置以及非常有用,所以关于配置文件的内容就留 待以后再续。

  • 相关阅读:
    ASP.NET MVC案例——————拦截器
    Windows Azure Virtual Network (10) 使用Azure Access Control List(ACL)设置客户端访问权限
    Windows Azure Storage (20) 使用Azure File实现共享文件夹
    Windows Azure HandBook (5) Azure混合云解决方案
    Windows Azure Service Bus (6) 中继(Relay On) 使用VS2013开发Service Bus Relay On
    Azure PowerShell (9) 使用PowerShell导出订阅下所有的Azure VM的Public IP和Private IP
    Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic
    Azure China (9) 在Azure China配置CDN服务
    Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob
    Windows Azure HandBook (4) 分析Windows Azure如何处理Session
  • 原文地址:https://www.cnblogs.com/UnGeek/p/3322529.html
Copyright © 2011-2022 走看看