如果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

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
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
我有用过screen,但是就是命令key很难记,所以不是很喜欢。
我记得我有弄过,只要ssh一次,之后的ssh都不许密码。因为第一次ssh,背后已经做了个session。
记得有做了笔记 http://linux.byexamples.com/archives/286/duplicate-ssh-session/
似乎,我也是在你那里看到screen才开始使用的。
有输出的C# mono 只能用SCREEN挂载
不知道C# mono是什么……