如果Linux用的比较多的话,你一定遇到过下面的场景。在终端启动了一个任务,这个比较耗时(比如cp, make, apt-get, wget),而此时你又需要在终端下做其它工作。你该如何是好?Ctrl + Alt + F1至F5,再开一个终端?gnome-terminator里面再开一个Tab?再启动一个rxvt?再做一次ssh连接?噢,当然,你还可以Ctrl + C,把那个耗时的进程杀掉。但这都不是一个好的解决之道,相对于使用screen来说。

screen的工作原理

  使用screen,你可以在同一个终端,同一个virtual terminator,同一个ssh中同时进行多个工作。它的大致工作原理是:当前shell中启动screen,此时screen是当前shell的一个子进程,而你现在处于screen的一个会话(session)的一个window中。这个window对应着一个shell进程(比如bash),当你陷入上面的场景时,screen可以让你再开一个(或多个)window,这个window又会对应一个新的shell进程。当然,这些window都在screen的大力监管之下,你可以在这些window之间自由切换。下面两图可能更能说清真象。

Local terminal

Local terminal

ssh remote

ssh remote

screen使用方法

  多数Linux发行版默认都已经有screen了,在终端下直接启动screen即可。启动screen之后,你可以像往常那样工作,几乎没有任何区别。一旦你需要多个window时,你就需要知道一些快捷键来和screen打交道了。几乎所有的screen命令都是以Ctrl + a开始,以另外一个按键结束的。比如Ctrl a c表示,同时按下Ctrl键和a键,松开后按下c键,此时screen就为你创建了一个新window。多数情况下,Ctrl a Key和Ctrl a Ctrl Key效果是相同的,即你也可以保持按下Ctrl键,接着一次敲击a键和c键来创建新screen。但这对有些命令就不再适用,比如你想向当前window传递Ctrl a本身,就必须是Ctrl a a,而不能是Ctrl a Ctrl a,因为后者用来在当前window和上一个window之间切换。常用的命令见下表,完全的命令列表参见screen的manpage。

C-a ? 显示所有键绑定信息
C-a w 显示所有window列表
C-a C-a 切换到之前显示的window
C-a c 创建一个新的运行shell的window并切换到该window
C-a n 切换到下一个window
C-a p 切换到前一个window(与C-a n相对)
C-a 0..9 切换到window0..9
C-a a 发送 C-a到当前window
C-a A 改变当前window的名字
C-a d 暂时断开screen会话
C-a k 杀掉当前window
C-a [ 进入拷贝/回滚模式

  对Ctrl a d稍作解释。你如果有进程组的概念,可以知道,一旦关闭screen所在的shell,或者断开ssh连接,screen进程就会被关闭,当然由screen管理的各个window下的各进程也都会被关闭。Ctrl a d可以将screen与shell断开(detach),这样即使关闭shell,screen及其子进程也不会被关闭。下次登录shell时,可以用screen -R来恢复先前的screen。

使用.screenrc

  就像很多其它程序一样,screen也有自己的配置文件,用来让用户改变和定制screen的外观和功能。screen的配置文件可以是全局的/etc/screenrc,也可以是自家目录下的.screenrc。我的.screenrc极为简单,只有寥寥3行。你可以参照manpage设置自己的screenrc,进行一些键绑定、选项设置等。

hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "
startup_message off
Tags: ,.
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Home

RFC: Request For Comments. Orz..

Name(required)
Mail (required),(will not be published)

RFC: Request For Comments. Orz..

Website(recommended)