Linux命令之Screen后台运行

一、 简介

Screen 用于命令行终端切换,用户可以通过该命令同时连接多个本地或远程的命令行会话,并在其间自由切换,在 screen 环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出

状态

使用 Screen 命令可开启一个另一个会话(终端),终端有两种状态

  • Attached 激活态,表示该终端作为主终端正在被使用
  • Detached 非激活态,表示该终端在后台运行

如下

1
2
3
4
$ screen -ls
There are screens on:
3676563.qwe (01/17/2023 07:54:52 PM) (Detached) # 非激活态
3676536.abc (01/17/2023 07:54:42 PM) (Attached) # 激活态

类似工具 Tmux

二、 安装

一般都预装了,没有就安装

1
apt -y install screen

三、 语法

1
screen [选项] [作业名称]
选项 注释
-a 强制将所有功能放入每个窗口的termcap
-A 将所有的窗口都调整为目前终端机的大小
-c 指定配置文件,默认 .screenrc
-d 将指定的会话离线
-D 将指定的会话离线并注销远程登录用户
-h 指定缓冲区行数
-i 流量控制开启时,中断输出更快
-l 登录模式打开
-ls, -list 显示目前所有的 Screen作业
-L 打开输出日志记录
-Logfile 输入日志路径
-m 忽略 $STY 变量,创建一个新的屏幕会话
-O 选择最佳输出
-r 恢复指定会话
-R 先试图恢复离线的会话,若没有则新会话
-s 指定执行的 Shell 环境,如 -s /bin/bash
-S 创建指定名称的会话
-t 设置标题
-U
-wipe 删除无法使用的离线作业
-x 恢复之前离线的作业
-X

快捷键

在每个会话下,所有命令都以按键 Ctrl+a (C-a) 开始

快捷键 注释
C-a ? 显示所有键绑定信息
C-a c 创建会话
C-a A 来为当前窗口重命名
C-a n 切换到下一个窗口
C-a p 切换到前一个窗口
C-a 0..9 切换到第 0..9 个窗口
C-a [Space] 由 窗口0 循序切换到窗口9
C-a C-a 在两个最近使用的 窗口间切换
C-a x 锁住当前 窗口,需用用户密码解锁
C-a d 保存会话,后台运行
C-a z 把当前窗口放到后台执行,用 fg 命令回去
C-a w 显示所有窗口列表
C-a t 显示时间
C-a k 关闭对话

四、使用

新建终端

直接输入 screen 回车,即可新建一个虚拟终端,但是这样的名称太乱,以Linux的 hostname 命名

1
2
3
4
$ screen -ls
There is a screen on:
3676800.pts-4.VM-0-6-ubuntu (01/17/2023 07:56:16 PM) (Attached)
1 Socket in /run/screen/S-root.

创建一个名为 2bacc 的窗口

1
screen -S 2bacc

执行后会立刻又返回到命令提示符,仿佛什么也没有发生似的,其实你已经进入Screen了

方法2

而我一般是使用 -R 创建虚拟终端

1
screen -R 3bacc

区别

创建方法区别

  • 使用 -R 创建,如果之前有创建同名的screen,则直接进入之前创建的screen
  • 使用 -S 创建和直接输入screen创建的虚拟终端,不会检录之前创建的screen(也就是会创建同名的screen)

执行命令

也可以在 screen 命令后面加入要执行的命令

1
screen vim david.txt

当退出 vim 将退出该窗口/会话

查看窗口

打开多个窗口后,可以使用 快捷键 C-a w 列出当前所有窗口

如果使用文本终端,这个列表会列在屏幕左下角,如果使用 X 环境下的终端模拟器,这个列表会列在标题栏里

开启三个窗口,其中 * 号表示当前位于 窗口2-号表示上一次切换窗口时位于 窗口1

1
0-$ bash 1-$ bash 2*$ bash

可以使用快捷键 C-a A 来为当前窗口重命名,按下快捷键后,输入新的名字,回车确认

回到终端

你可以不中断程序的运行而暂时断开(detach),并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序

例如,打开一个会话窗口编辑 hello.txt 文件

1
screen vim hello.exe

之后我们想暂时退出做点别的事情,比如出去散散步,可以按下快捷键 C-a d 会给出提示

1
[detached from 2048.pts-0.localhost]

半个小时之后回来了,找到该会话

1
2
3
4
$ sudo screen -ls
There is a screen on:
2048.pts-0.localhost (Detached)
1 Socket in /run/screen/S-root.

重新连接会话,一切都在

1
screen -r 2048

区别

大小写使用区别

  • 使用 -r 回到指定会话,如果不存在,则不操作
  • 使用 -R 回到指定会话,如果不存在,则自动创建新的虚拟终端

退出会话

比较推荐的方法,是进入对应虚拟终端,然后输入

1
exit

之后,就会回到主终端


当然,也可以在主终端内,使用命令释放

1
2
# 使用 -R/-r/-S 均可
screen -R [pid/Name] -X quit

方法2

如果由于某种原因其中一个会话死掉了,这时 screen -ls 会显示该会话为 Dead 状态

1
2
3
4
5
6
$ screen -ls
There are screens on:
1377.xxx (12/15/2021 09:45:16 AM) (Detached)
1309.pts-0.hello (12/15/2021 09:33:30 AM) (Dead ???)
Remove dead screens with 'screen -wipe'.
2 Sockets in /run/screen/S-root.

清除该会话

1
2
3
4
5
6
$ screen -wipe
There are screens on:
1377.xxx (12/15/2021 09:45:16 AM) (Detached)
1309.pts-0.hello (12/15/2021 09:33:30 AM) (Removed)
1 socket wiped out.
1 Socket in /run/screen/S-root.

再次查看,已经清除掉 Dead 会话了

1
2
3
4
$ sudo screen -ls
There is a screen on:
1377.xxx (12/15/2021 09:45:15 AM) (Detached)
1 Socket in /run/screen/S-root.

方法3

另一个关闭窗口的方法是使用 C-a k 这个 快捷键 杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程

会话共享

假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个s会话,你朋友可以在他的终端上命令

1
screen -x

这个命令会将你朋友的终端 Attach 到你的Screen会话上,并且你的终端不会被断开(Detach)。这样你就可以和朋友共享同一个会话了

如果你们当前又处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到这个会话的不同窗口中去,那还是可以分别进行不同的操作的。

会话锁定与解锁

Screen 允许使用快捷键 C-a s 锁定会话。锁定以后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但你的输入都会被Screen中的进程接收到。快捷键 C-a q 可以解锁一个会话

也可以使用 C-a x 锁定会话,不同的是这样锁定之后,会话会被Screen所属用户的密码保护,需要输入密码才能继续访问这个会话

发送命令到会话

在Screen会话之外,可以通过screen命令操作一个Screen会话,这也为使用Screen作为脚本程序增加了便利

在 sandy 的 screen 会话中创建一个新窗口并运行ping命令

1
screen -S sandy -X screen ping www.baidu.com

屏幕分割

可以使用快捷键 C -a S 将显示器水平分割,也支持垂直分屏,快捷键是 C-a |。分屏以后,可以使用 C-a <tab> 在各个区块间切换,每一区块上都可以创建窗口并在其中运行进程。、

可以用 C-a X 快捷键关闭当前焦点所在的屏幕区块,也可以用 C-a Q 关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭,还可以通过窗口切换找到它