screen教程

前言

假设你现在有一个VPS可以使用,而且系统是Linux,一般都是通过SSH远程登陆进行管理。如果我们需要在VPS上长期运行一个程序,直接在SSH连接中运行程序并不能达成目的,因为程序会在SSH断开时停止运行。而使用screen命令就可以避免SSH中断导致的程序中断问题。

首先当然是用Putty或者Xshell登陆VPS,这里就不细说了。

使用方法

使用screen或者screen -S <your name>命令打开子界面。使用screen时,只能用系统分配的编号来恢复子界面,如果使用screen -S,并附上自定义的名字,就能用名字来恢复子界面,后面会谈如何恢复子界面。

1
[root@localhost ~]# screen -S my_screen

回车后得到一个新的界面:

1
[root@localhost ~]#

现在就可以在这里运行任何需要长期运行的程序,比如这个简单的Python程序:

1
[root@localhost ~]# vim test.py
1
2
3
4
5
import datetime
import time
while True:
print datetime.datetime.now()
time.sleep(5)

程序的效果是每五秒打印一次系统时间:

1
2
3
4
[root@localhost ~]# python test.py
2017-2-14 16:56:04.439517
2017-2-14 16:56:09.444224
2017-2-14 16:56:14.453887

运行程序后,需要挂起子界面,按下Ctrl+A后抬起,然后按下d键,此时就会切换回原来的界面,并提示“detached”:

1
2
3
[root@localhost ~]# screen -S my_screen
[detached]
[root@localhost ~]#

现在即便是退出SSH,也不会影响到screen里面运行的程序,目标已达成。screen不仅仅能保持程序的运行,还能一直保留程序的输出信息,以备查看。

如果你以后需要查看程序的输出,就要恢复Screen子界面:screen -ls可以输出目前正在运行的子界面列表:

1
2
3
4
5
[root@localhost ~]# screen -ls
There is a screen on:
1676.my_screen (Detached)
1 Socket in /var/run/screen/S-root.
[root@localhost ~]#

这时自定义名称就能用起来:输入screen -r my_screen,或者screen -r 1676同样可以恢复子界面,但当子界面比较多时可能就比较混乱,推荐用自定义的名字。

1
2
3
4
5
6
7
8
[root@localhost ~]# python test.py
2017-2-14 16:56:04.439517
2017-2-14 16:56:09.444224
2017-2-14 16:56:14.453887
2017-2-14 16:56:19.453887
2017-2-14 16:56:24.458580
2017-2-14 16:56:29.463413
2017-2-14 16:56:34.468418

如果信息太多,就按下Ctrl+A后抬起,然后按下[键,就能通过键盘上下键滚动查看历史。

键绑定

什么?快捷键太多记不住?那就按下Ctrl+A后抬起,然后按下?键,查看所有的键绑定。

一般常用键绑定

  • 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 [ 进入拷贝/回滚模式

其他常用命令选项

  • -c file 使用配置文件file,而不使用默认的$HOME/.screenrc
  • -h num 指定历史回滚缓冲区大小为num行
  • -list|-ls 列出现有screen会话,格式为pid.tty.host
  • -d -m 启动一个开始就处于断开模式的会话
  • -r sessionowner 重新连接一个断开的会话。
  • -S sessionname 创建screen会话时为会话指定一个名字
  • -v 显示screen版本信息
您的支持将鼓励我继续创作!