Screen简介

验证安装及简单分析SSH中断

Screen是现在各大发行版本Linux的一个都会安装的应用,主要可以给SSH、Tenlnet等登陆中提供保持后台会话的功能,保证你在退出对话框以后还可以再Linux后台继续运行。

查看是否安装/版本可以运行以下命令:

rpm -qa|grep screen

IBM developerWorks 做了以下分析来解释为什么我们退出SSH等对话框会造成会话中断:

在Linux/Unix中,有这样几个概念:

  • 进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
  • 会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
  • 会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。

根据POSIX.1定义:

  • 挂断信号(SIGHUP)默认的动作是终止程序。
  • 当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
  • 如果会话期首进程终止,则该信号发送到该会话期前台进程组。
  • 一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。

因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。

下面我们来看截图以便验证。

我打开了两个SSH,其中右侧的运行top(拿来玩的机器,装了transmission挂PT,firefox挂Vagex):

在左侧的SSH中首先运行名列查看top的进程:

ps -ef|grep top

找到top的进程ID为13297,其父进程ID为13255,在运行bash,为了查看这个进程之间的关系我们运行以下命令:

pstree -H 13297|grep top

可以很清楚看到SSH登录在bash中运行top命令,我们再运行ps xj命令看下

ps xj|grep 13255

可以看到,登录shell(PID 13297)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为13297,top所在进程组PGID为13255,为前台进程组。

关掉右侧的窗口再运行ps就可以看到13255这个整个进程关掉了。

运行Screen

在Shell界面中运行以下命令,在出来的界面中如果有提示按下空格进去,按回车退出screen。

[root@nicky1605 ~]# screen

Screen将创建一个新全屏窗口。你可以执行任何命令,如果想要退出exit,否则你关掉窗口后台还是在运行。可以看到运行了命令以后标题也会有变化。

退出后又会回到原来的界面,类似于我们vi编辑保存后返回的界面似的。但是会有一个终止的提示,同样我们也可以专门为了一个程序开一个screen窗口,例如我的vim,

但是你一旦退出这个命令窗口也就退出来了。大家可以看标题。

Screen语法及运用

语法:

screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

参数:

-A  将所有的视窗都调整为目前终端机的大小。

-d <作业名称>  将指定的screen作业离线。

-h <行数>  指定视窗的缓冲区行数。

-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。

-r <作业名称>  恢复离线的screen作业。

-r? <id> 打开编号为id的screen窗口。

-ls 查看有哪些screen。

-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。

-S  指定建立新视窗时,所要执行的shell。

exit? 退出当前窗口,如果它是此screen的唯一窗口时,此screen也将完全退出。

你可能注意到给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫做键绑定(key binding),C-a叫做命令字符(command character)。

C-a c 在当前screen下建立新的窗口? (按住Ctrl 键, 然后敲a,然后再敲c,其他类似)

C-a d 暂时断开screen会话。

C-a w 显示所有窗口列表

C-a n 切换到下一个窗口

C-a p 切换到前一个窗口(与C-a n相对)

C-a ?? 显示所有键绑定信息

C-a C-a? 切换到之前显示的窗口

C-a c 创建一个新的运行shell的窗口并切换到该窗口

C-a 0..9? 切换到窗口0..9

C-a a? 发送 C-a到当前窗口

C-a d? 暂时断开screen会话

C-a k 杀掉当前窗口

C-a [ 进入拷贝/回滚模式

例子

screen -S new?? 新建一个叫new的session

screen -r new?? 回到new这个session 或者 screen -r 15287

screen -d new?? detach session 暂离某个session

后续

另一种screen的替代工具是Tmux,它功能更强大使用更复杂,对多用户共享屏幕非常有用。一个常见的应用就是远程双人共同编程。

我有很多东西都是基于IBM developerWorks,上面介绍的更加详细。


网友评论4

  1. 板凳
    oyoy:

    技术党玩的东东,技术白表示看不懂

    2012-10-19 15:33 [回复]
  2. 沙发
    免费资源部落:

    我要回到以前的Screen还得记下那个进程的数字吗?

    2012-10-18 23:43 [回复]

发表评论

表情
还能输入210个字