Linux下使用screen工作How-to

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

概述

一般,我们创建一个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

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清理被杀死的会话。

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

Leave a Reply

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