2008年4月7日星期一

GNU screen

我们先从 terminal 讲起,传统意义的 terminal 一般只有一个监视器和键盘,通过如串口等直接与主机相连,为了实现这一模型需要硬件和软件的协同工作。硬件上,该 terminal 必须自带一个字库,含有一定的 buffer,当主机上的数据传送过来通过查字库获得显示的信息,进而在监视器上显示出来。另一方面,敲击键盘时,实际上直接将按键信息发送到主机,主机通过回显(echo)的方式把对应的数据返回到 terminal,或者不返回。

这个模型势必存在下面的问题,主机可能并不知道 terminal 能够以多快的速率接受数据,也不知道通过什么样的方式使得 terminal 实现自己需要的效果。这都是由硬件决定的,没有办法更改的。现在,似乎纯粹的 terminal 已经不多见了,取而代之的是基于个人电脑的 terminal,也就是所谓虚拟终端。尽管虚拟终端的能力上已经比原来强大了很多,但是原先遗留下来的一些硬件标准必须依靠合适的软件来模拟。同时,如 Microsoft 已经不满足于基于文字的终端的要求,它所基于别人的协议开发的 RDP(也是 Windows Terminal Service)就是一个允许通过 GUI 实现的虚拟终端。

更多关于 terminal 的知识,可以参考 Text Terminal HOWTO 文献。

那么 GNU screen 是什么呢?这是 screen 的 info 中给出的介绍:
Screen is a full-screen window manager that multiplexes a physical terminal between
several processes, typically interactive shells. Each virtual terminal provides the
functions of the DEC VT100 terminal and, in addition, several control functions from
the ISO 6429 (ECMA 48, ANSI X3.64) and ISO 2022 standards (e.g. insert/delete line
and support for multiple character sets). There is a scrollback history buffer for
each virtual terminal and a copy-and-paste mechanism that allows the user to move
text regions between windows.
可见 screen 的作用就是把一个物理终端(包括虚拟终端)分成多个窗口(虚拟终端)。那么它有什么用呢?第一,某些终端上不允许产生多个窗口,因此如果在某个程序运行中希望获得另外一个程序给出的信息,往往只能通过向本程序发出 suspend 信号(^Z),这时可利用 screen 的多窗口特性解决;第二,往往运行了某一个程序后希望它在后台执行,但是等到希望 logout 时,发现该程序没有执行完,尽管可以用 nohup 解决,但是一般可能忘记预料到这点,screen 允许这个时候用户与其 detach,并 logout,这也避免了使用不稳定线路(如 modem、wifi)接入的用户的不必要损失;第三,screen 允许多个用户共用一个虚拟终端,这使得 TUI 协作变得可能(VNC 使得 GUI 协作变得可能)。这里给出一个参考网站

我们先从基本的 screen 使用说起。screen 有一个配置文件,一般在 /etc/screenrc,可以把它复制到 ~/.screenrc,然后编辑它,里面都是 screen 支持的命令,这些命令可以在进入 screen 后用 C-a : 来输入,实时的产生效果。其实 screen 默认的 key binding 下,所有的命令都是用 C-a 开头的。如果没用过 screen,可以直接输入,就会进入到 screen 里面,你会发现只是又进入到了一个新的 shell 里面,该 shell 继承了运行 screen 的 shell 的环境变量。如果你想暂时离开 screen,甚至是退出本次登录(结束运行 screen 的这个 session),那么可以直接 C-a d,这会和 screen detach,但是并没有结束该 screen 的 session。等你什么时候记得 screen 的时候,也许换了一种连接主机的方法(可以从网络、直接用 console、从 serial port 还是别的什么)连接到该主机,可以用 screen -list 看到一共你打开过了多少个 screen sessions。然后可以选择连接哪一个,比如某一个处于 detached 状态,那么你可以 screen -r name(如果仅有一个可以省略)。如果处于 attached 状态,你想 detach 原来的连接,则可以 screen -d -r,但是你也许还希望不断开直接连接上,那么 screen -x -r,很有意思的是这样连上去两边可以同时看到某个窗口的变化,但是又允许使用不同的窗口分别同时完成任务。那么怎么建立新的窗口呢?一般说来可以在已有的 screen 里面继续激活 screen(不带有 -m 参数),或者通过 screen command 在新窗口执行该命令(执行完后会关闭该窗口),不过最简洁的还是 C-a c 了。为了在已有的窗口之间跳转,可以使用 C-a " 获得所有窗口的列表并进行选择,或者直接 C-a 0-9 切换,还可以 C-a n/p 在前后两个窗口切换,而 C-a a 则和 Emacs 的 C-x b 一样,很方便在两个窗口间跳转。如果不需要某个窗口可以在 shell 里面 exit,当然 C-a k 比较方便,而临时不用可以用 C-a x 锁定。最好的在线帮助就是 C-a ?,这会给出一些最常用的 key binding。

下面我们将就一些较高级的应用做出说明。
  • 可能你需要回滚屏幕以查看那些超出屏幕上缘的信息,可是你发现 Shift + Page Up/Down 不再有用了,难道是 screen 不支持吗?再看看顶上 info 里面的介绍吧,怎么可能!的确是支持的,C-a [,你发现这时居然可以任意的移动光标了,如果你记得看一下 C-a ? 的说明的话你会发现其实你进入的是 copy mode,换句话说在这种情况下你可以将一个 window 里面的信息复制出来,然后通过 C-a ] 贴到另外一个 window 里面去,你在自己的 terminal 里面没有诸如 gpm 或者 gnome-terminal 的复制粘贴功能而你又需要的时候,你就会感谢 screen 的作者这都帮你想到了。
  • -r 和 -R,-d 和 -D,大写的一般都比较牛一点,如 -R 在没有可以 reattach 的情况下允许创建一个新的 screen session,-D 甚至可以 detach 并让远程退出。这样可以依照你的需求组合出你需要的效果。-RR 表示如果存在多个 session 则处理第一个。
  • -S,如果不喜欢默认的 session 名字可以用 -S 加入。
  • 前面说道 multi-display 的 -x,实际上 screen 另外支持 multi-user,但是似乎这个代价有点得不偿失,这个连接里面提到需要给 screen 设置 set-uid 位,还需要改变 /var/run/screen 的 user mode 为 755。然后才能按照这里的说法配置成功,而 debian 默认是不许可的。
  • 可以和 Emacs 一样将一个窗口分成两个,命令是 C-a S,切分后可以用 C-a TAB 将焦点换到另外的部分,C-a Q 关闭除当前以外所有,C-a X 关闭当前。
  • 可以给 window 设置 title,命令是 C-a A。可以用 C-a w 获得列表,或者 C-a ' 选择跳转。这个可以设置为一个动态的。
  • 如果 screen 显示不正常,可以用 C-a l 重绘。另外如果出现花屏,可以用 reset 命令,或者 C-a Z。
  • 在 copy mode 里面用 SPC 设置复制区域,Y 可以复制一行,W 是一个单词。/ 进行搜索。
  • 如果需要自己的 key binding 可以用 bind 命令绑定,格式是 bind key command,这里 key 里面 ^x 表示 C-x。

3 条评论:

匿名 说...

You really make it seem so easy with your presentation but
I find this matter to be actually something that I think I would never understand.
It seems too complicated and extremely broad for me.

I am looking forward for your next post, I will try to
get the hang of it!

Feel free to surf to my page ... Pure HCA

匿名 说...

When someone writes an paragraph he/she maintains the plan of
a user in his/her mind that how a user can be aware of it.
Thus that's why this piece of writing is perfect. Thanks!

Also visit my website: Veluminous

匿名 说...

Spot on with this write-up, I honestly feel this web site needs much more attention.
I'll probably be returning to read through more, thanks for the info!

Feel free to surf to my web site: Raspberry Ketone Plus Review