分类: LINUX
2010-06-24 16:05:39
目录 |
原文出处:未知
原文作者: jeduthun
授权许可:未知
翻译人员:MillenniumDark, leal
校对人员:leal
适用版本:all
大多數現代Unix类操作系統(比如Linux,、MacOS X和BSD等)都帶有一個叫做GNU Screen的終端模式下的小工具。如果把終端比作戰士,那GNU Screen就是戰士手中強有力的武器,對於文本模式下的人機交互而言,它是一把名副其实的瑞士軍刀。
僅管這一工具用处很大,却被很多人所忽视。原因何在?因为它的存在几乎少有人知,即便是那些知道的人也很少能理解它要解决的问题!在這篇文 章中,我將解釋screen會為你做什么,并且提供一些使用screen完成基本任務的簡單介紹。本文目标读者是那些能熟练使用命令行,但对screen 本身只有很少或几无经验的人。
一言以蔽之,screen是个终端的多路复用器。借助screen,你可以在单个终端内運行任意数量的基于終端的應用程序,如交互的命令 shell,基于curses的應用程序,文本編輯器等等。做到這點的渴望正是大多數人迷上screen的原因。过去我登录到系统后,常常得打开六七个终 端模拟器:一个用来读邮件,一个用来编辑代码,一个来编译代码,一个用来阅读新闻,一个用作登录web主机的shell,等等。现如今,我只要启动一个终 端模拟器,然后在其中运行screen。Ok,一切搞定。
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 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里没有“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,译注)之必备用品。