• [转]screen 的使用


    当我们使用securecrt,putty, 等连接远程服务器时,如果正在执行一个程序,比如shell 脚本,退出当前的窗口会导致程序终止!其原理如下:
    根据POSIX.1定义:
    1 挂断信号(SIGHUP)默认的动作是终止程序。
    2 当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
    3 如果会话期首进程终止,则该信号发送到该会话期前台进程组。
    一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。
     
    使用一个例子:securecrt 通过ssh 连接远程服务器
    在会话1 执行top命令
    在会话2 进行查看top进程ID 为20543 其父进程为12158,即登录shell。
    [root@rac3 sh]# ps -ef | grep top
    root     20543 12158  0 19:23 pts/1    00:00:00 top
    root     20578 12189  0 19:25 pts/2    00:00:00 grep top
     
    使用pstree 命令查看上述关系  
    [root@rac3 sh]# pstree -H 20543 | grep top
         |-sshd-+-sshd---bash---top
    [root@rac3 sh]# ps -xj | grep 20543
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
    12156 12158 12158 12158 pts/1    20543 Ss       0   0:00 -bash
    12158 20543 20543 12158 pts/1    20543 S+       0   0:00 top
    12189 20569 20568 12189 pts/2    20568 R+       0   0:00 grep 20543
    [root@rac3 sh]# 
    由ps -xj 命令查看top 命令和登录的shell -bash同属于一个会话期,shell为会话期首进程,做在进程组为12158 ,top 命令所在的PGID 为20543,为前台进程组!
    关闭第一个会话,top命令被kill 掉!
    [root@rac3 sh]# ps -ef | grep top  
    root     20845 12189  0 19:35 pts/2    00:00:00 grep top
    [root@rac3 sh]# 
    如何避免SIGHUP信号中断导致当前窗口执行的命令被迫中断,大家会想到nohup,使用如下方法:
    nohup command & 
    使得command 命令在后台执行。但是对于nohup的用法未免有些简单 ,我们可以使用一个更加强大的命令--screen。
    Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式:
    查看系统是否安装screen 
    [root@rac3 sh]# rpm -qa|grep screen
    screen-4.0.3-1.el5
    gnome-screensaver-2.16.1-8.el5
    如果没有安装则可以使用yum install screen 来安装screen
    Screen命令语法:
    screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
    Screen命令参数:
    -A -[r|R]          将所有的视窗都调整为目前终端机的大小。
    -c filename        用指定的filename文件替代screen的配置文件’.screenrc’.
    -d [pid.tty.host]  断开screen进程(使用该命令时,screen的状态一定要是Attached,也就是说有用户连在screen里)。一般进程的名字是以pid.tty.host这种形式表示(用screen -list命令可以看出状态)。
    -D [pid.tty.host]  与-d命令实现一样的功能,区别就是如果执行成功,会踢掉原来在screen里的用户并让他logout。
    -h <行数>         指定视窗的缓冲区行数。
    -ls或–list         显示目前所有的screen作业。
    -m                 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
    -p number or name  预先选择一个窗口。
    -r [pid.tty.host]  恢复离线的screen进程,如果有多个断开的进程,需要指定[pid.tty.host]
    -R                 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
    -s shell           指定建立新视窗时,所要执行的shell。
    -S <作业名称>      指定screen作业的名称。(用来替代[pid.tty.host]的命名方式,可以简化操作).
    -v                 显示版本信息。
    -wipe              检查目前所有的screen作业,并删除已经无法使用的screen作业。
    -x                 恢复之前离线的screen作业。
    进入screen的具体的方法:
    1 直接输入 screen 命令,会进入由screen创建的全新的窗口。
    [root@rac3 ~]# screen 
    Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。
     
    2 screen 后面直接跟 要执行的命令:
    [root@rac3 ~]# screen  vi hivedb.sh 
     
    之后使用ctrl+a d 命令中断当前的screen会话,但是当你再次进入的时候,依然是退出时候的状态!
      
    参考文档:
    http://www.ibm.com/developerworks/cn/linux/l-cn-screen/
     
    原文链接:http://blog.itpub.net/22664653/viewspace-716291/
  • 相关阅读:
    《Think Python》第7章学习笔记
    Arrays和String单元测试
    结对编程项目-四则运算 第二周
    2018-2019-2 20175227张雪莹《Java程序设计》 实验二《Java面向对象程序设计》
    类定义
    20175227张雪莹 2018-2019-2 《Java程序设计》第六周学习总结
    结对编程项目-四则运算 第一周 阶段性总结
    迭代和JDB
    20175227张雪莹 2018-2019-2 《Java程序设计》第五周学习总结
    结对学习小组
  • 原文地址:https://www.cnblogs.com/unqiang/p/3910714.html
Copyright © 2020-2023  润新知