大多数现代Unix类操作系统(比如Linux,、MacOS X和BSD等)都带有一个叫做GNU Screen的终端模式下的小工具。如果把终端比作战士,那GNU Screen就是战士手中强有力的武器,对于文本模式下的">人机交互而言,它是一把名副其实的瑞士军刀。
仅管这一工具用处很大,却被很多人所忽视。原因何在?因为它的存在几乎少有人知,即便是那些知道的人也很少能理解它要解决的问题!在这篇文章中,我将解释screen会为你做什么,并且提供一些使用screen完成基本任务的简单介绍。本文目标读者是那些能熟练使用命令行,但对screen本身只有很少或几无经验的人。
screen之作用
一言以蔽之,screen是个终端的多路复用器。借助screen,你可以在单个终端内运行任意数量的基于终端的应用程序,如交互的命令shell,基于curses的应用程序,文本编辑器等等。做到这点的渴望正是大多数人迷上screen的原因。过去我登录到系统后,常常得打开六七个终端模拟器:一个用来读邮件,一个用来编辑代码,一个来编译代码,一个用来阅读新闻,一个用作登录web主机的shell,等等。现如今,我只要启动一个终端模拟器,然后在其中运行screen。Ok,一切搞定。
screen另一个很酷的主要特性是它能使运行着的程序脱离终端模拟器。也就是说即使你不小心关闭终端模拟器,screen也能让程序继续运行;甚至在你注销之后,它也能让程序在你下次登录后从上次中断处继续执行。也就意味着,所谓的“会话”——你在期间运行大量终端程序——是个自由流动的实体,你可以把它绑定到任意处的任意终端上,甚至根本不绑定,只要你愿意。
screen新手上路:启动以及在程序间进行切换
在你最爱的命令shell提示符下键入screen即可启动screen。也许会收到一条欢迎信息,任意键略过该信息,就会进入一个空白终端,只包含一个shell提示符,一切和你启动screen之前实在是差不多。那究竟暗藏了什么?
在screen下运行的每个程序在各自窗口内运行,每个窗口都有一个独一无二的数字标志号。Screen建立一个新窗口,标记为0,并在窗口内启动一个命令shell。试着在新窗口里输入些东西,以便过会儿你切换回到该窗口时能认出它来。
现在再建立一个窗口;那会是窗口1。按C-a c即可建立新窗口;详细步骤为,先按下Ctrl-a,然后按c(即创建create窗口)。
现在你有两个窗口了,试着在两者之间进行切换。具体动作为按C-a C-a,它会切换到当前窗口之前你使用的窗口。如果你打算运行两个以上的程序,你会需要如下一些有用的窗口切换方法:
使用C-a n和C-a p切换至窗口列表里的下一个或上一个窗口,按窗口号排序。
使用C-a N——N为0到9之间的数字——切换至相应窗口。
使用C-a " 来获得一份全屏的窗口列表。你可以使用箭头键(或者vi风格的j和k)浏览列表,在某窗口项处于高亮显示时,按回车键可激活该窗口。C-a w会显示一个小型、不能交互的窗口列表。
使用一个窗口的时候,按C-a A可以给它起名。这个名字将显示在窗口列表里,当你使用大量窗口时,它可帮助你回想起自己在每个窗口里干吗来着。
退出一个窗口中的最后一个程序后,该窗口便自行消失。你也可以用C-a K来杀死那些反常的程序。
卸下和重新附加:终端分离之妙
如果你确实做了上面的练习,那你已成功建立了一个screen会话。你可以按C-a d卸下这个会话,此外关闭包含该会话的终端模拟器也可以卸下会话。不过,请记住,上述两种方法实际上都没有终止你的会话。它们只是解开你的会话和当前终端的绑定,你所启动的运行在screen里的所有程序仍在运行之中,千真万确。
试试这个:关闭你用来做上述练习的所有终端模拟器,然后只要你愿意,甚至可以注销,重新登录。启动一个新的终端模拟器,键入screen -r(这里的R自然是代表reattach),你会回到上次卸下会话的状态。
你大可以想象一下这带来的一大堆好处。你可以一次性启动所有自己喜爱的控制台程序,然后让它们运行在一个持续的screen会话里。有些人甚至让screen在那儿工作数月。
卸下和重新附加的另一个大用场是用作控制台模式的“远程桌面”。你可以卸下一个上班时的screen会话,在家用shell登录那台机器,然后重新附加。非常,非常好用。再加点努力,你甚至可以把多个终端全都附加到同一个会话里,对协同工作和会议而言奇妙无比。
复制,粘贴,以及回滚缓冲
Screen会记下回滚行数(行数可配置),它能派上用场,因为在运行screen时你将无法使用终端模拟器的回滚功能。键入C-a [进入“copy mode”,你便可以访问回滚缓存。你可以给回滚缓冲里任意处的文本打上记号,并用C-a ]进行粘贴。Screen还能把日志写入文件中,不过该主题已超出本指南讨论范围。
监视沉默和活动
在screen里运行一大团程序的不足之一是你无法同时监视所有程序,因为一般来说,你每次只能看见一个。(事实上,你可以分割屏幕,一次看到多个,此属高级用法,不在本指南讨论范围之内)为了减少这一麻烦,Screen提供了如下特性,你可以监视一个窗口的沉默,比如用于获悉编译何时完成;或者监视一个窗口是否活跃,比如用于获悉某人最后在你喜欢的IRC频道上的谈话时间。
开始或停止监视当前的窗口的30秒沉默了30秒,按C-a _ ;开始或停止监视当前的窗口的活动,按C-a M。
和screen说拜拜
如卸下和重新附加一节所述,screen不易杀死(退出)。你不能只是关掉包含它的终端。(实际上,你可以这么做,不过所有进程仍会在系统中运行,等待被重新附加。)在screen里没有“quit”(退出)一键,那又该怎样才能完全退出screen呢?
据我所知,体面(即不是通过发送恶意的信号给进程而退出)退出screen的唯一途径是关闭每个screen窗口。退出每个screen运行的程序或shell,它们就会乖乖走开。当screen里运行的最后一个程序退出之时,screen本身也就“一命呜呼”了。
其它资料
Screen之能力远多于我上面所描述的功能,不过本文所写已足够你上手之用。身在screen里时,你可以键入C-a ?获取一份简要的命令列表。screen的man页也有大量信息,如有疑问,你还可以参考下列web资源:
Yahoo GNU Screen讨论组 screen邮件列表更新相当快,潜伏着许多高手。
Sven Guckes的 Screen页面 另一个概要页面;比本文更为简洁。
screen官方主页 无需赘言,该页对细节所述少的可怜。
screen man页 排版相当棒,组织成多个小节。很不错的参考手册。一定不要错过关于如何使用.screenrc定制screen的几个小节。
Screen FAQ 新手不宜,但实为解决疑难杂症、居家旅行(别扔臭鸡蛋……,纯粹kidding,译注)之必备用品。