zoukankan      html  css  js  c++  java
  • [转]linux中强大的screen命令

    [转]linux中强大的screen命令

    http://pythonorg.diandian.com/post/2012-01-05/40027464147

    今天用SCREEN用点生了,有几个功能不知道怎么用,上网搜了一下,有位哥们写的挺细的,向这哥们致敬,我这里就转走了,备查用。因为还有好几个有用实用好用的功能文章都没有描述到。我将在转载的最后给预补充。以下转载开始

    转载地址:http://hi.baidu.com/nkhzj/blog/item/9de2cdfdddf0db42d7887d42.html

    今天发现了一个“宝贝”,就是Linux的screen命令,对于远程登录来说,不仅提供了类似于nohup的功能,而且提供了我非常喜欢的“多个桌面”的功能。

    平常开一个putty远程登录,经常需要在两个程序之间来回切换,怎么办?ctrl-z和fg、bg?这些太麻烦了。其实我们可以借助screen命令来实现轻松便捷的切换。

    我主要是参考了下面的两篇文章(附在结尾),我自己总结的方法是:


    “首先用screen [-S]命令建立一个session,然后就可以在这个session中建立多个window了。使用screen [-S]可以建立多个session,而每个session又可以建立多个window。在不同的window之间可以用Ctrl-A n/p等命令来切换。而想要在多个session之间切换,则需要你Ctrl-A d回到登录session(就像一棵大树的根),然后再通过screen -ls查看有哪些session,然后使用screen -r来决定恢复到哪个session。对于已经Attached Session则不能直接screen -r,需要先screen -d,然后才能screen -r”

    ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

    【转载1】

    系统管理员经常需要远程登录服务器
    然后在服务器上跑一些程序
    有个时候
    得跑很长时间(超过12小时)
    这是如果程序没结束就退出远程管理终端
    远程跑的程序很有可能就此当掉
    以前常用的解决方式是用命令nohup
    但是nohup也有很多的问题
    当有了screen
    这一切便都迎刃而解了
    敲入命令screen
    会创建一个跑着shell的单一窗口
    在这里面
    你可以跑你所需要的程序
    然后Ctrl+a d退出刚创建的窗口(回到进入screen前的环境)
    然后再敲入命令screen创建新的终端窗口
    就这样
    你可以建立多个有shell的窗口(这些窗口里都可以跑你自己的应用)
    这样就是你退出远程管理窗口(进入screen的环境)
    你的screen窗间的窗口都不会关闭
    里面跑得应用自然也不会当掉
    用screen -ls可以看所有的screen sessions
    用screen -r sessionid可以进sessionid指定的特定的screen session
    最后screen session不再使用的时候
    screen -r sessionid进去
    exit退出即可


    Unix/Linux 工具: Screen 命令使用
    screen使用
    使用screen非常简易.只需在SHELL键入screen,便可打开一个screen session。
    而在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
    现在让我来简单介绍基本的命令
    C-a c -> Create,开启新的 window
    C-a n -> Next,切换到下个 window
    C-a p -> Previous,前一个 window
    more..
    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,以便「接手」过来


    实例:
    说明看了那么多,让我们用一个实际例子来结束我们今天的学习。
    在我们开启一个screen后,然后使用joe编辑一个文件,之后因为临时需要离开这时就可以运行Ctrl+a d,显示如下:
    [becks@ec-base becks]$ screen
    [detached]
    这个时候当我们运行ps -e 可以看到pts/2这个我刚刚运行的screen正在运行joe
    6264 pts/2 00:00:00 bash
    6354 pts/2 00:00:00 joe
    而当我们回来后想恢复这个session,只需要键入screen -r,而当你有多个session时候,系统将提示你选择一个,如下:
    [becks@ec-base becks]$ screen -r
    There are several suitable screens on:
    6263.pts-1.ec-base (Detached)
    6382.pts-1.ec-base (Detached)
    Type "screen [-d] -r [pid.]tty.host" to resume one of them.
    输入该session的pid进行恢复
    [becks@becks becks]$ screen -r 6263
    想退出screen的session,和退出shell一样,只需要键入exit命令,成功退出后将有以下提示
    [screen is terminating]

    【转载2】

    linux screen 命令详解 功能说明:

    使用telnet或SSH远程登录linux时,如果连接非正常中断,重新连接时,系统将开一个新的session,无法恢复原来的 session.screen命令可以解决这个问题。Screen工具是一个终端多路转接器,在本质上,这意味着你能够使用一个单一的终端窗口运行多终端 的应用。

    语 法:

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

    补充说明:

    screen为多重视窗管理程序。此处所谓的视窗,是指一个全屏幕的文字模式画面。通常只有在使用telnet登入主机或是使用老式的终端机时,才有可能用到screen程序。

    参 数:

    -A 将所有的视窗都调整为目前终端机的大小。
    -d <作业名称> 将指定的screen作业离线。
    -h <行数> 指定视窗的缓冲区行数。
    -m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
    -r <作业名称> 恢复离线的screen作业。
    -R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
    -s 指定建立新视窗时,所要执行的shell。
    -S <作业名称> 指定screen作业的名称。
    -v 显示版本信息。
    -x 恢复之前离线的screen作业。
    -ls或--list 显示目前所有的screen作业。
    -wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。

    常用screen参数:

    screen -S yourname -> 新建一个叫yourname的session
    screen -ls -> 列出当前所有的session
    screen -r yourname -> 回到yourname这个session
    screen -d yourname -> 远程detach某个session
    screen -d -r yourname -> 结束当前session并回到yourname这个session

    在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。

    C-a ? -> Help,显示简单说明
    C-a c -> Create,开启新的 window
    C-a n -> Next,切换到下个 window
    C-a p -> Previous,前一个 window
    C-a 0..9 -> 切换到第 0..9 个window
    Ctrl+a [Space] -> 由視窗0循序換到視窗9
    C-a C-a -> 在两个最近使用的 window 间切换
    C-a x -> 锁住当前的 window,需用用户密码解锁
    C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里    每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
    C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令則可回去。
    C-a w -> Windows,列出已开启的 windows 有那些
    C-a t -> Time,显示当前时间,和系统的 load
    C-a K -> kill window,强行关闭当前的 window

    【转载完,以下是我的补充】
    1. 改变窗口名字

    一般在我用的过程中,一个SESSION都会对应好几个窗口(WINDOW)。比如我按下CTRL+a w查询窗口口列表,给出来

    1$ bash  2-$ bash  3*$ irc

    总共3个窗口,默认都是bash ,最后的3我以给改过名了,叫IRC,这样多个窗口就记起来就方便多了, 改名是按CTRL+a A大写A,是改名,小写a是和上次你用的窗口切换,这个是一个实用的功能,这样你开很多个window也很容易记住。
    1*$ project  2$ bash  3-$ irc

    我的3个窗口,一个是项目的,一个是用来执行SHEEL,一个是我的IRC,是用来聊天,或者测试用的。

    2. 使用指定的会话名字

    xsty@xsty-desktop:~$ screen -dmS irctest
    xsty@xsty-desktop:~$ screen -r
    There are several suitable screens on:
            4687.irctest    (2010年09月11日 15时58分08秒)   (Detached)
            4225.pts-0.xsty-desktop (2010年09月11日 14时45分15秒)   (Detached)
    Type "screen [-d] -r [pid.]tty.host" to resume one of them.

    默认情况下screen使用的名字是PID.TTY.HOST的命名规则,如果有太多会话,那么多的PID可能分不清哪个是哪个,所以很有必要指定一个好记的名字,这时就用-mdS选项

    3. 还有另一编文章,是IBM上的,基本上上面说的都以经说了比较全面了。

    下面转载过来http://www.ibm.com/developerworks/cn/linux/l-cn-screen/
    linux 技巧:使用 screen 管理你的远程会话

    田 强 (tianq@cn.ibm.com), 软件工程师, IBM中国软件开发中心

    2007 年 7 月 31 日




    你是不是经常需要远程登录到Linux服务器?你是不是经常为一些长时间运行的任务头疼?还在用 nohup 吗?那么来看看 screen 吧,它会给你一个惊喜!

    你 是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连 接,否则这个任务就会被杀掉,一切半途而废了。

    元凶:SIGHUP 信号

    让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。

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

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

    根据POSIX.1定义:

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

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

    我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。

    [root@tivf09 root]# top

    在另一个终端窗口,找到top的进程ID为5180,其父进程ID为5128,即登录shell。

    [root@tivf09 root]# ps -ef|grep top
    root      5180  5128  0 01:03 pts/0    00:00:02 top
    root      5857  3672  0 01:12 pts/2    00:00:00 grep top

    使用pstree命令可以更清楚地看到这个关系:

    [root@tivf09 root]# pstree -H 5180|grep top
    |-sshd-+-sshd---bash---top

    使用ps-xj命令可以看到,登录shell(PID 5128)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组。

    [root@tivf09 root]# ps -xj|grep 5128
     5126  5128  5128  5128 pts/0     5180 S        0   0:00 -bash
     5128  5180  5180  5128 pts/0     5180 S        0   0:50 top
     3672 18095 18094  3672 pts/2    18094 S        0   0:00 grep 5128

    关闭第一个SSH窗口,在另一个窗口中可以看到top也被杀掉了。

    [root@tivf09 root]# ps -ef|grep 5128
    root     18699  3672  0 04:35 pts/2    00:00:00 grep 5128

    如 果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终 端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。

    nohup <command> [argument…] &

    虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。

    其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如Red Hat Enterprise Linux 4)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。

    [root@tivf06 ~]# rpm -qa|grep screen
    xscreensaver-4.18-5.rhel4.11
    screen-4.0.2-5

    开始使用Screen

    简 单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多 个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方 式:

    1.直接在命令行键入screen命令

    [root@tivf06 ~]# screen

    Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。

    2.Screen命令后跟你要执行的程序。

    [root@tivf06 ~]# screen vi test.c

    Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。

    3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入de>C-a cde>,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。

    screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/abc文件:

    [root@tivf06 ~]# screen vi /tmp/abc

    之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入de>C-a dde>,Screen会给出detached提示:


    暂时中断会话

    半个小时之后回来了,找到该screen会话:

    [root@tivf06 ~]# screen -ls
    There is a screen on:
            16582.pts-1.tivf06      (Detached)
    1 Socket in /tmp/screens/S-root.

    重新连接会话:

    [root@tivf06 ~]# screen -r 16582

    看看出现什么了,太棒了,一切都在。继续干吧。

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

    可以通过de>C-a ?de>来查看所有的键绑定,常用的键绑定有:


    C-a ? 显示所有键绑定信息 C-a w 显示所有窗口列表 C-a C-a 切换到之前显示的窗口 C-a c 创建一个新的运行shell的窗口并切换到该窗口 C-a n 切换到下一个窗口 C-a p 切换到前一个窗口(与C-a n相对) C-a 0..9 切换到窗口0..9 C-a a 发送 C-a到当前窗口 C-a d 暂时断开screen会话 C-a k 杀掉当前窗口 C-a [ 进入拷贝/回滚模式

    Screen常用选项

    使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:


    Screen 常用选项

    因为screen把C-a看作是screen命令的开始,所以如果你想要screen窗口接收到C-a字符,就要输入C-a a。Screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:

    -exy x为命令字符,y为转义命令字符的字符

    下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t ?命令可以看到该变化。

    [root@tivf18 root]# screen -e^tt


    自定义命令字符和转义字符

    其他常用的命令选项有:


    -c file 使用配置文件file,而不使用默认的$HOME/.screenrc -d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话 -h num 指定历史回滚缓冲区大小为num行 -list|-ls 列出现有screen会话,格式为pid.tty.host -d -m 启动一个开始就处于断开模式的会话 -r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限 -S sessionname 创建screen会话时为会话指定一个名字 -v 显示screen版本信息 -wipe [match] 同-list,但删掉那些无法连接的会话

    下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r <screen_pid>重新连接上:

    [root@tivf18 root]# screen –ls
    There are screens on:
            8736.pts-1.tivf18       (Detached)
            8462.pts-0.tivf18       (Detached)
    2 Sockets in /root/.screen.
    
    [root@tivf18 root]# screen –r 8736

    如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

    [root@tivf18 root]# kill -9 8462
    [root@tivf18 root]# screen -ls  
    There are screens on:
            8736.pts-1.tivf18       (Detached)
            8462.pts-0.tivf18       (Dead ???)
    Remove dead screens with 'screen -wipe'.
    2 Sockets in /root/.screen.
    
    [root@tivf18 root]# screen -wipe
    There are screens on:
            8736.pts-1.tivf18       (Detached)
            8462.pts-0.tivf18       (Removed)
    1 socket wiped out.
    1 Socket in /root/.screen.
    
    [root@tivf18 root]# screen -ls  
    There is a screen on:
            8736.pts-1.tivf18       (Detached)
    1 Socket in /root/.screen.
    
    [root@tivf18 root]#

    -d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname

    启动一个初始状态断开的screen会话:

    [root@tivf06 tianq]# screen -dmS mygdb gdb execlp_test

    连接该会话:

    [root@tivf06 tianq]# screen -r mygdb

    管理你的远程会话

    先 来看看如何使用screen解决SIGHUP问题,比如现在我们要ftp传输一个大文件。如果按老的办法,SSH登录到系统,直接ftp命令开始传输,之 后。。如果网络速度还可以,恭喜你,不用等太长时间了;如果网络不好,老老实实等着吧,只能传输完毕再断开SSH连接了。让我们使用screen来试试。

    SSH登录到系统,在命令行键入screen。

    [root@tivf18 root]# screen

    在screen shell窗口中输入ftp命令,登录,开始传输。不愿意等了?OK,在窗口中键入C-a d:


    管理你的远程会话

    然后。。退出SSH登录?随你怎样,只要别杀掉screen会话。

    是 不是很方便?更进一步,其实我们可以利用screen这种功能来管理你的远程会话,保存你所有的工作内容。你是不是每次登录到系统都要开很多窗口,然后每 天都要重复打开关闭这些窗口?让screen来帮你“保存”吧,你只需要打开一个ssh窗口,创建需要的screen窗口,退出的时候C-a d“保存”你的工作,下次登录后直接screen -r <screen_pid>就可以了。

    最好能给每个窗口起一个名字,这样好记些。使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字,可能名字出现的位置不同。使用putty:


    putty

    使用telnet:


    telnet

    更多Screen功能

    Screen 提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定 screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定 screen配置文件。

    以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定 multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文 件内容请参考screen的man页。

    参考资料

    • “Advanced Programming in the UNIX? Environment: Second Edition” W. Richard Stevens, Stephen A. Rago 提供了更多关于Linux/Unix进程关系、信号的知识。
    • GNU Screen的官方网站:http://www.gnu.org/software/screen/
    • Screen的man page提供了最详细的信息:http://www.slac.stanford.edu/comp/unix/package/epics/extensions/iocConsole/screen.1.html


    关于作者


    田强,中国软件开发中心 Tivoli 部门软件工程师,负责 IBM 产品TMF(Tivoli Management Framework)的维护和客户支持工作,热爱 Linux。

  • 相关阅读:
    关于CString与VARIANT(CComVariant)之间的转化
    关于_T()说明
    关于COM组件调用
    关于ATML信号定义的理解-1
    关于DOM的事件操作
    javascript(二)
    javascript(一)
    进程.线程.协程之间的区别?
    CSS
    HTML 浅层漫谈
  • 原文地址:https://www.cnblogs.com/vc60er/p/4216532.html
Copyright © 2011-2022 走看看