Linux下使用screen工作How-to

  • 通过ssh在Linux终端下工作,有一个很烦的事情就是,如果需要执行一个长时间的命令(例如拷贝一个大文件,或者做DDL)时,如果终端意外断开(网络或者别的原因),一般命令就会终止,当然你可以使用nohup命令,这里提供另一个办法:使用screen

    Updates

    修改Bash提示符@2024-09

    每次去执行echo $TERM也挺麻烦的,所以,另一个办法就是在Bash的提示符中,将变量$TERM展示出来:

    vim ~/.bash_profile
    ...
    export PS1="[\u@$TERM \W]\$ "
    ...

    此外,还需要再 .screenrc文件中新增如下代码:

    shell -$SHELL

    关于该代码的说明:How to tell GNU screen to run .bash_profile in each new window?@ServerFault

    更进一步的,可以使用如下的PS1

    export PS1="[\u@${TERM}-${STY#[0-9]*.} \W]\$ "

    这里说明一下${STY#[0-9]*.}这部分内容:

    • ${STY} 是一个screen下的环境变量,在screen运行时可以获取当前session的名称(“Alternate socket name”)
    • ${STY#[0-9]*.} 这里的 #后面的部分,则是Bash的string操作符号,这里的删除后面的匹配的子串(Substring Removal)。更多详细说明,参考:Manipulating Strings@Advanced Bash-Scripting Guide

    如何判断当前是不是在screen下@2024-05

    只需要在终端尝试输出$TERM即可:

    echo $TERM
    screen

    如果是非screen下,可能会看到如下输出:

    echo $TERM
    xterm-256color

    初次使用vim按ctrl+s锁屏@2024-05

    同样是发送了XOFF导致的锁屏问题。

    在现代的开发者中,如果初次使用vim,还不习惯使用:w进行保存时,比较容易遇到这个问题,因为现在软件中,ctrl+s已经默认是保存操作了。

    这也是同样的原因,可以使用ctrl+q进行解锁操作。这与screen是类似的,同样是发送了XOFF命令字符导致的。

    关于ctrl+a,S锁屏的问题@2024-05

    在刚开始使用screen的时候,经常会误触ctrl+a,S(ctrl+a,后面跟一个命令键S)导致屏幕锁定,这时候可以通过ctrl+a,Q来解除锁定。

    如果被这个困扰的比较厉害,可以考虑禁用ctrl+a,S命令。禁用的方法是在~/.screenrc中新增如下命令内容(参考):

    bind s

    为什么ctrl+a,S会锁定屏幕@2024-05

    经过一段时间的搜索挖掘,大致确认,这是一个早期屏幕输出设备的一个指令之一,可以控制屏幕输出流。ctrl+a,S更多的时候是ctrl+s,会发送XOFF命令字符(ASCII码编号是19)告诉服务器不要在发送输出内容,也就是我们感受到的“锁定屏幕”,可以使用ctrl+a,qctrl+q再次发送XON命令字符(ASCII码编号是17)实现解锁。

    关于更多底层原理可以参考如下文章:

    Update(2010-10-08) :screen -ls查看列表

    [supu@host u01]$ screen -ls
    There is a screen on:
    9348.supu (Detached)
    1 Socket in /var/run/screen/S-supu.

    可以通过kill -9 9348杀死该会话,然后通过screen -wipe清理被杀死的会话。

    概述

    一般,我们创建一个screen会话,然后连接会话并在会话下工作,这时候,我们可以随时挂起会话,去做别的事情,而且这个挂起的会话会一直在后台执行。而后又可以重新连接会话。下面是一个简单的How-to:

    1. How-to

    1.1 创建一个screen会话

    screen -dmS supu

    该命令,创建一个名为supu的会话,当时并不立刻进入会话。

    1.2 连入会话

    screen -r supu

    连入会话后,就可以做任何想做的工作了。

    1.3 挂起该终端

    如果你在会话中,做了某个需要等很久的操作,或者你需要离开一段时间,这时就需要执行挂起操作了:

    (ctrl+a) + D 先按下Ctr+a然后按D键(screen捕获ctrl+a,后面跟一个命令键D,可以通过ctrl+a ?查看更多)

    1.4 其他相关

    而后,可以重新使用-r参数回到会话;在会话中,用exit可以退出并关闭这个会话;还可以使用screen -ls命令来查看当前的全部会话状态。

    2. 一些名词

    Attached和Detached

    一般screen -ls可以看到多个会话状态,例如:

    [admin@my174 ~]$ screen -ls 
    There are screens on:
     22872.supu (Detached)
     18283.pts-3.my174 (Attached) 
    2 Sockets in /var/run/screen/S-admin.

    Detached表示会话处于挂起状态,Attached表示有终端在连接会话。

    “22872.supu”这是会话名。22872是一个唯一会话ID,后面supu是自定义的会话名,可以使用screen -r 22872等同于screen -r supu。

    Enjoy!

    参考:linux 技巧:使用 screen 管理你的远程会话 | man screen

    2 responses to “Linux下使用screen工作How-to”

    Leave a Reply

    Your email address will not be published. Required fields are marked *