验证安装及简单分析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,上面介绍的更加详细。
本文作者为Nicky,转载请注明。
技术党玩的东东,技术白表示看不懂
@oyoy嗯,艺多不压身
我要回到以前的Screen还得记下那个进程的数字吗?
@免费资源部落直接用screen -R