跳到主要内容

screen

· 📖 3分钟 ⏳
無心

screen 是一个强大的终端多路复用器, 允许你在一个终端窗口内运行多个独立的会话。它的主要功能包括会话管理、后台运行、断开连接后恢复会话等, 非常适合远程服务器管理和长时间运行的任务。

基本功能

1、会话管理

  • screen 可以在一个终端中创建多个虚拟终端, 每个终端运行独立的进程。
  • 会话可以分离(detach)和重新连接(reattach), 即使你关闭了当前的终端窗口或断开了 SSH 连接, 也能恢复原有的工作环境。

2、后台运行

  • 使用 screen 启动的程序可以在后台运行, 即使用户退出会话, 程序仍然继续运行。

3、会话共享

  • 多个用户可以通过共享一个 screen 会话进行协作, 每个用户都可以看到和操作同一个会话。

通常情况下, screen 创建的终端环境有两种工作模式

  • Attached: 表示当前 screen 正在作为主终端使用, 为活跃状态
  • Detached: 表示当前 screen 正在后台使用, 为非激活状态

常用命令

安装 screen

# centos 
yum install -y screen

# ubuntu
apt install -y screen

查看已有虚拟终端

:~$ screen -ls
There is a screen on:
3627.pts-0.kind (2024年07月31日 09时36分10秒) (Detached)
1 Socket in /run/screen/S-root.

创建虚拟终端

# 启动一个新的会话
screen

# 指定会话名称
screen -R session_name # 推荐
# 或
screen -S session_name
  • 使用 -R 创建, 如果已有一个同名的 screen, 则会直接进入之间创建的 screen
  • 使用 -S 创建, 如果已有一个同名的 screen, 则会在创建一个新的同名screen, 不会检索以前的

分离当前会话

Ctrl + a, d

重新连接已有的会话

# 查看会话名称或pid
:~$ screen -ls
There are screens on:
3733.hello (2024年07月31日 09时59分41秒) (Detached) # pid.name
2 Sockets in /run/screen/S-root.

# screen -r [pid/name]
:~$ screen -r hello # 或 screen -r 3733

结束会话

在会话内

# 使用 exit 命令
:~$ exit

在会话外

:~$ screen -r [pid/name] -X quit

会话终端输出写入日志文件

创建会话时写入日志文件

:~$ screen -L -Logfile /tmp/screen_hello.log -R hello

在已有会话内将后续终端输出写入日志文件

:~$ screen -X logfile /tmp/screen_hello.log
:~$ screen -X log

无法进入 Attached 状态的终端

在某些状态下, 非正常退出了虚拟终端, 而通过查看虚拟终端的状态还是 Attached, 这时通过 screen -r 是无法进入这个虚拟终端的。可以使用 screen -d 将终端状态置为 Detached。

# 查看终端状态
:~$ screen -ls
There is a screen on:
4287.hello (2024年07月31日 10时27分12秒) (Attached)
1 Socket in /run/screen/S-root.

# 无法进入虚拟终端
:~$ screen -r hello
There is a screen on:
4287.hello (2024年07月31日 10时27分12秒) (Attached)
There is no screen to be resumed matching hello.

# 重置终端状态
:~$ screen -d hello
[4287.hello detached.]

# 查看终端状态
:~$ screen -ls
There is a screen on:
4287.hello (2024年07月31日 10时27分13秒) (Detached)
1 Socket in /run/screen/S-root.

# 进入终端
:~$ screen -r hello