2007年4月21日星期六

unix/linux命令工具:screen

如果我们想退出终端而让我们的程序继续运行,怎么办?
nohup。
不错,但是如果我们要交互怎么办?
这个。。。?还真不知道
我知道,其实我也是刚知道不久,有一个命令被我们遗忘了,screen。

她到底什么呢?
我们从她的man说起。
官方man说“screen manager with VT100/ANSI terminal emulation”,据我使用觉得她类似我们在实机上时的按Ctrl+Alt+Fn所出现的终端。
她的命令格式为:
screen [ -options ] [ cmd [ args ] ]
当我们运行screen的时候就会新建一个窗口,并且启动一个shell,然后你就可以做和其他登录shell一样的事情了,但是只有一个例外,有些键被重新配置了,比如C-a(Ctrl+a)
当你敲C-a时就进入screen的管理模式。

首先我们先新建一个screen,可以有多种方法:
直接敲screen,这时自动产生一个窗口,并分配了一个名字
直接输入screen 命令,比如screen emacs,
或输入screen -S name,就会产生一个名字为name的窗口。

接下来我们看看screen的管理模式的一些基本命令:
C-a c -> Create,开启新的 window
C-a n -> Next,切换到下个 window
C-a p -> Previous,前一个 window
C-a C-a -> Other,在两个 window 间切换
C-a w -> Windows,列出已开启的 windows 有那些
C-a 0 -> 切换到第 0 个 window
C-a 1..9 -> 切换到第 1..9 个window
C-a a -> 发出 C-a,在 emacs, ve, bash, tcsh 下可移到行首
C-a t -> Time,显示当前时间,和系统的 load
C-a K(大写) -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、
复制就像用使用 vi 一样

C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上
C-a ? -> Help,显示简单说明

C-a d -> detach,将目前的 screen session (可能含有多个 windows)
丢到后台执行 当按了 C-a d 把 screen session detach 掉后,会回到还没进 screen 时的状态,此时在 screen session 里每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。

下次 login 进来时:

screen -ls -> 显示所有的 screen sessions
screen -r [keyword] -> 选择一个screen session 恢复对话

若 screen -ls 里有 Attached sessions:
screen -d [keyword] -> 强制 detach,以便「接手」过来

我们可以做一个例子:
[david@David ~]$ screen
[david@David ~]$ screen -ls
There is a screen on:
6909.pts-2.David (Attached)
1 Socket in /var/run/screen/S-david.
其中前面的数字为id,后面为终端号,再后面为主机名字
按C-a d,会出现
[detached]
回到最开始的终端,这时我们可以使用
[david@David software]$ screen -r 6909
重新连到新开的screen。

基本的screen命令基本上已经够用了,更详细的命令可以使用man。

没有评论: