Linux使用 Screen 命令

[本文参考了这篇文章]

先放个screen命令总结在这里,前三个最常用,最后一个很特别。

  • screen -ls 列出所有screen session
  • screen -S name 创建1个新的名字为 name的screen session
  • screen -r name 重新连接到名字为 name的screen session
  • screen -d name 断开名字为 name的screen session
  • screen -x name 连接到一个已经Attached的名字为 name的screen session,(多显示器模式)

我们通过各种桌面主机(Windows, Linux, MacOS) 使用SSH连接到远端Linux服务器的时候,经常需要让Linux服务器运行长时间任务,比如连续下载或者测试。如果我们将连接远端Linux服务器的桌面主机关闭,那么远端服务器的任务也会因为SSH连接中断而停止运行。这时候我们就希望即便关闭PC或断开SSH连接,远端服务器的程序仍可正常运行,当我们第二天早上起来后打开PC,就能看到远端服务器运行的结果了。这个效果就使用 screen 可以实现。有了screen命令,就不用当心我们断开SSH连接后造成任务中断 了。

1. 创建screen会话

可以先执行:screen -S test,screen就会创建一个名字为test的会话。

【创建完test的会话以后就可以去放心的执行我们想运行的东西了,在此期间,可以随时关闭SSH,或自己的电脑,我们执行的东西仍然在服务端不停的执行】。

$ screen -ls
There is a screen on:
        3775547.test    (Attached)
1 Socket in /run/screen/S-c.

2. 离开或者关闭ssh会话

使用screen的目的就是为了让原会话中的任务或程序在当前SSH连接断开后能继续执行。当需要临时离开时(会话中的程序不会关闭,仍在运行)时,可以在远端Linux的Shell用快捷键Ctrl+a d(即按住Ctrl,依次再按a,d)。如果上述方法无效,则可以再启动一个SSH连接到该Linux服务器,然后找出screen session的名字或id,再新的SSH终端里执行如下命令就可以把第一个screen session给脱离了:
screen -d test

3. 恢复screen会话

你会看到它还在自己没有停止的执行!

当回来时可以再执行执行:screen -r test即可恢复到离开前创建的test会话的工作界面。如果忘记了创建的Scerrn会话名称,或者当时没有指定会话名

可以执行:screen -ls

screen会列出当前存在的会话列表, 一串数字.test即为刚才的screen创建的test会话,目前已经暂时退出了test会话,所以状态为Detached,当使用screen -r test后状态就会变为Attached,这一串数字是这个screen的会话的进程ID,恢复会话时也可以使用:screen -r 这串数字(上例中的3775547)

4. 关闭screen的会话

和退出Linuxshell一样,在Shell里执行:exit ,会提示:[screen is terminating],表示已经成功退出screen会话。只是注意此时屏幕显示会比较混乱,因为并没有进行屏幕擦除。

Screen 常用快捷键

Ctrl+a c :在当前screen会话中创建窗口

Ctrl+a w :窗口列表

Ctrl+a n :下一个窗口

Ctrl+a p :上一个窗口

Ctrl+a 0-9 :在第0个窗口和第9个窗口之间切换

额外补充知识

列出当前所有的session

screen -ls(或者screen -list) 一个例子,后续会进行详细解释。

$ screen -list
There are screens on:
2019958.test (Attached)
2019919.pts-0.localhost (Detached)
2 Sockets in /run/screen/S...

注意看列出的2个session有不同的两个状态。Attached表示目前有终端连接到此session,用户可以和这个session进行交互操作了,而 detached则表示没有终端连接到此screen session。

新建一个screen session的几种方法

有如下几种方式,执行后都是直接进入新的screen session :

  1. screen 后什么参数都没有,则默认产生一个新session并在其中启动一个新shell程序。查看时它对应的信息是 pid.tty.host 格式,比如上面的那个 2019919.pts-0.localhost
  2. screen -S session_name 这个通过自己指定一个新screen session名字的方式,来方便区分不同screen session。查看时它对应的信息是 pid.session_name 格式,比如上面的那个 2019958.test推荐用这种方式
  3. screen cmd/script 这种呢因为命令行里多了个cmd或script,则启动新screen session后不再启动shell,而是执行cmd/script,执行完毕则自动结束这个screen session,所以有如下两个例子:
  • screen date 执行后屏幕一闪而过,因为date命令瞬间就可以执行完毕,然后screen就退出了。
  • screen top 执行后屏幕就会停留在新的screen里,不断刷新,因为top命令是一直在运行的,此时screen -ls 就可以看到它。

多显示器模式Multiple Display Mode

这个模式很有趣,当用户已经连接(Attached)到一个正在运行的screen session后,用户可以在开启一个SSL连接,在新的连接里用 -x 参数也连接到同一个screen session,则这两个终端的用户会显示完全相同内容,在任一个终端里操作任何内容,另一个终端会同步显示。这个功能可以用于演示或者远程协助。

# 先在一个终端里执行此命令查看当前的screen session
$ screen -ls
There is a screen on:
        3775547.test    (Attached)
1 Socket in /run/screen/S-.

# 此时新开一个SSH连接,连接 后输入screen -x test,则新的终端也显示同样内容

$ screen -ls
There is a screen on:
        3775547.test    (Attached)
1 Socket in /run/screen/S-.

# 然后两个连接窗口就会有完全相同表现了。