[本文参考了这篇文章]
先放个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 :
screen
后什么参数都没有,则默认产生一个新session并在其中启动一个新shell程序。查看时它对应的信息是 pid.tty.host 格式,比如上面的那个2019919.pts-0.localhost
。screen -S session_name
这个通过自己指定一个新screen session名字的方式,来方便区分不同screen session。查看时它对应的信息是 pid.session_name 格式,比如上面的那个2019958.test
。推荐用这种方式。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-.
# 然后两个连接窗口就会有完全相同表现了。