screen使用教程

安装教程

1
2
3
4
5
6
7
8
  # CentOS
  yum install screen

  # Debian/Ubuntu
  apt install screen

  # Cygwin
  运行cygwin的setup程序进行安装

screen使用教程

screen常用命令,分屏

如果一个screen实例中有多个窗口,其他窗口也有人叫做区块

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 创建名字为test的实例
screen -S test

# 左右分屏(‘或’的符号)
"ctrl+a, |"

# 上下分屏(以及改名,切换屏幕,创建新窗口)
ctrl+a, S

# 滚屏
ctrl+a,[

# 切换窗口
ctrl+a, tab

# 查看所有窗口
ctrl+a, "

# 查看所有区块,会在左下角显示
ctrl+w

# 通过窗口切换,每个窗口都会有编号,可以通过编号切换过去
ctrl+a,id

# 关闭当前焦点所在的屏幕区块
ctrl+a, X

# 关闭除当前区块之外其他的所有区块
ctrl+a, Q
# 关闭的区块中的窗口并不会关闭,还可以通过窗口切换(C-a 窗口id)找到它。 ctrl a + k 真正关闭当前窗口

# 创建新终端(以及改名)
ctrl+a, c

# 切换终端
ctrl+a ctrl+a

# 切换终端
ctrl+a p/n

# 改名
ctrl+a, A

# 列出所有实例
screen -ls

# 在当前screen下,输入Ctrl+D,删除该screen
Ctrl+D

# 在当前screen下,输入先后Ctrl+A,Ctrl+D,退出该screen
Ctrl+A,Ctrl+D  

# attach一个Detached的实例
screen -r [name/pid] 

# attach一个已经Attached的实例
screen -x [name/pid] 

# Detached当前实例
ctrl+a, d

# kill当前实例
ctrl+a, k
exit

# 连接状态为【Attached】的screen,解释:-D -r 先踢掉前一用户,再登陆
screen -D  -r your_screen_name

# 判断当前是否在screen中断下,Ubuntu系统中在/etc/screenrc文件末尾追加一行即可允许设置screen标题
echo 'caption always "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%H %Y/%m/%d "'

# 删除指定screen, your_screen_name为待删除的screen name
screen -S your_screen_name -X quit

C/P模式和操作 screen的另一个很强大的功能就是可以在不同窗口之间进行复制粘贴了。使用快捷键C-a 或者C-a [可以进入copy/paste模式,这个模式下可以像在vi中一样移动光标,并可以使用空格键设置标记。其实在这个模式下有很多类似vi的操作,譬如使用/进行搜索,使用y快速标记一行,使用w快速标记一个单词等。关于C/P模式下的高级操作,其文档的这一部分有比较详细的说明。

一般情况下,可以移动光标到指定位置,按下空格设置一个开头标记,然后移动光标到结尾位置,按下空格设置第二个标记,同时会将两个标记之间的部分储存在copy/paste buffer中,并退出copy/paste模式。在正常模式下,可以使用快捷键C-a ]将储存在buffer中的内容粘贴到当前窗口。

用法详解

语法

1
  screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
选项
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
  -A  将所有的视窗都调整为目前终端机的大小。
  -d <作业名称>  将指定的screen作业离线。
  -h <行数>  指定视窗的缓冲区行数。
  -m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
  -r <作业名称>  恢复离线的screen作业。
  -R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
  -s  指定建立新视窗时,所要执行的shell。
  -S <作业名称>  指定screen作业的名称。
  -v  显示版本信息。
  -x  恢复之前离线的screen作业。
  -ls或--list  显示目前所有的screen作业。
  -wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  C-a ? -> 显示所有键绑定信息
  C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
  C-a n -> Next,切换到下一个 window 
  C-a p -> Previous,切换到前一个 window 
  C-a 0..9 -> 切换到第 0..9 个 window
  Ctrl+a [Space] -> 由视窗0循序切换到视窗9
  C-a C-a -> 在两个最近使用的 window 间切换 
  C-a x -> 锁住当前的 window,需用用户密码解锁
  C-a d -> dettach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。 
  C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
  C-a w -> 显示所有窗口列表
  C-a t -> time,显示当前时间,和系统的 load 
  C-a k -> kill window,强行关闭当前的 window
  C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
		C-b Backward,PageUp 
		C-f Forward,PageDown 
		H(大写) High,将光标移至左上角 
		L Low,将光标移至左下角 
		0 移到行首 
		$ 行末 
		w forward one word,以字为单位往前移 
		b backward one word,以字为单位往后移 
		Space 第一次按为标记区起点,第二次按为终点 
		Esc 结束 copy mode 
		C-a ] -> paste,把刚刚在 copy mode 选定的内容贴上

screen配置

这段配置是在网上copy下来的,以我的使用需求不配置也不影响什么

config

there are two configure file of screen on linux,

  • /etc/screenrc
  • ~/.screenrc

here is my .screenrc

1
2
3
4
5
6
7
  defencoding en_US
  encoding UTF-8 en_US

  vbell off
  altscreen on
  hardstatus alwayslastline
  hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'

issues

"Must be connected to a terminal"

执行 screen 的时候碰到这个错, 先执行 script /dev/null

或者在screen命令后加上 -d -m 参数即可执行不会报错.

因由:因为服务器需要定时重启一个特定服务,该服务用screen命令启动,到时间执行的时候遇到报错:Must be connected to a terminal。

如何用bash脚本创建screen并向其发送命令?

1
screen -dmS test
1
2
3
4
screen -dmS test 
screen -S test -X stuff "ls -a\n" 
screen -S test -p 0 -X stuff "ls -a\n"

解析命令-ChatGPT

这些命令是使用 screen 进行会话管理和自动化输入的示例。我们来逐个解析:

1. screen -dmS test

各部分解析:
  • screen:启动 screen 会话,screen 是一个终端多路复用器,允许在一个终端窗口内运行多个虚拟终端。
  • -d:这个选项告诉 screen 在后台启动会话。也就是说,screen 会话启动后不会占用当前的终端窗口,而是将其放在后台运行。
  • -m:强制启动一个新的会话,即使没有其他正在运行的 screen 会话。
  • -S test:指定会话的名称为 test。-S 选项后面的 test 是会话的标识符,通过这个名字,你可以后续对该会话进行操作(例如发送命令、分离等)。
作用:

这个命令的作用是:启动一个名为 test 的 screen 会话,并将其放在后台运行。此时会话没有关联到任何窗口(终端)。它是一个“分离模式”启动的 screen 会话。

2. screen -S test -X stuff "ls -a\n"

各部分解析:
  • screen:再次调用 screen,用于对已存在的 screen 会话进行操作。
  • -S test:指定要操作的会话名称为 test。
  • -X:执行对 screen 会话的命令。-X 选项让我们向 screen 会话发送命令。
  • stuff "ls -a\n":stuff 命令将 ls -a(列出当前目录的所有文件,包括隐藏文件)发送到指定会话的当前窗口中,并模拟按下回车键(\n)。这等同于在该会话的终端中执行了 ls -a 命令。
作用:

该命令将 ls -a 这个命令发送到名为 test 的 screen 会话中的当前窗口,模拟在该窗口执行 ls -a。由于是后台操作,所以并不会直接在终端显示输出,命令的结果会被发送到该 screen 会话的输出流。

3. screen -S test -p 0 -X stuff "ls -a\n"

各部分解析:
  • screen:同样,调用 screen 来操作会话。
  • -S test:指定会话名称为 test。
  • -p 0:指定窗口编号为 0,即第一个窗口。screen 会话可以包含多个窗口,这个命令告诉 screen 要向编号为 0 的窗口发送命令。
  • -X stuff "ls -a\n":将 ls -a 发送到指定窗口,并模拟按下回车键。
作用:

该命令将 ls -a 命令发送到名为 test 的 screen 会话中的第一个窗口(编号为 0),并模拟按下回车键。这意味着,如果会话已经包含多个窗口,这个命令只会作用于第一个窗口,而不会影响其他窗口。

总结

  1. screen -dmS test:在后台启动一个新的 screen 会话,命名为 test。
  2. screen -S test -X stuff "ls -a\n":向名为 test 的 screen 会话的当前窗口发送 ls -a 命令并执行。
  3. screen -S test -p 0 -X stuff "ls -a\n":向名为 test 的 screen 会话的第一个窗口(编号为 0)发送 ls -a 命令并执行。

这些命令组合起来,可以实现对后台 screen 会话的自动化控制和命令发送,适用于需要在后台运行的程序和脚本的自动化管理。

Licensed under CC BY-NC-SA 4.0