Linux 必备的终端复用工具:screen

三葉Leaves Author

screen 是 Linux 服务器运维人员几乎都会用到的一个工具,这篇教程给出一些最常用的命令和使用实践

用人话说清你何时需要 screen

Linux 中有些命令执行完以后,给你返回一条“我搞定了”就没了(甚至不返回任何信息,比如 mkdir )。
而有些执行以后会一直占着终端不放,还不时输出一些日志信息,但你无法与其交互。这种进程被称作守护进程(Daemon),例如 web 应用中的前后端进程。

还有些进程,一样占着终端不放,但是你可以与进程进行一些交互,就像 Minecraft 游戏服务器的 Java 进程一样,你可以往里面打命令去控制一些玩家和游戏的行为。这种进程被称作前台进程(Foreground Process)

然而,在运行这些进程的时候,你也许需要去做些别的事情,毕竟一台机子不可能只跑它一个程序吧?比如一边运行着 web 项目,一边还要做些 git 操作,那不就需要一个新的终端了吗?
此时我们可以在执行上述进程时候加上 & 符号或者使用 nohup 参数来让它在后台乖乖运行,但一旦这种进程多了难免会出事。本文介绍的 screen 命令就是一个强大的工具,专门处理上述情境中的问题。

§1 必会操作

会话操作

创建新会话

创建一个名为 my_task 的会话:

1
screen -S my_task

会话内快捷键

当你已经进入了一个 screen ,你可以先按住 ctrl + A ,再按其他可选命令键来实现:

1
2
3
4
5
6
7
8
9
10
Ctrl+a D           # 暂时离开当前会话(detach)

Ctrl+a K # 杀死当前窗口

Ctrl+a C # 在当前 screen 会话中创建新窗口

Ctrl+a N # 切换到下一个窗口
Ctrl+a P # 切换到上一个窗口

Ctrl+a W # 显示所有窗口列表

在会话中输入 quit 也可以强制杀死当前会话并退出。用 exit 则是正常退出。

会话管理:

查看都有哪些 screen 在运行:

1
screen -ls

重新连接会话:

1
2
3
screen -r         # 如果只有一个会话,直接连接

screen -r <会话名称> # 连接指定会话

往会话里发命令:

就比如发一个强制退出命令,以此杀死 id 为 12345 的会话:

1
screen -S 12345 -X quit
  • -S 参数指定要操作的会话
  • -X 参数表示要向这个会话发送命令
  • quit 是发送的具体命令,用于终止会话

会话状态:

当你使用 screen -ls 时,可以查看到会话后面带着一个状态标识,比如:

查看会话的状态
查看会话的状态

1. Attached(已连接)状态

  • 定义:代表你当前处在这个会话之中,处于交互模式。
  • 切换到此状态screen -r <会话ID>

2. Detached(已分离)状态

  • 定义:代表这个会话在后台正常运行。
  • 切换到此状态:在 screen 会话中按下 Ctrl + A,然后按下 d,这会使得当前 screen 会话从终端中分离出来。进程依然在后台运行,但不再直接与终端交互。
  • 恢复会话:你可以使用 screen -r 命令恢复分离的 screen 会话,继续与进程交互。

3. Multi-screen(多屏幕)状态

  • 定义:一个 screen 会话可以包含多个虚拟终端(即多个"屏幕")。这使得你可以在同一个 screen 会话中同时运行多个程序或会话。在不同屏幕之间切换时,每个屏幕的状态和程序都是独立的。
  • 切换到此状态:在 screen 中使用 Ctrl + A 然后按 c 来创建新的屏幕,使用 Ctrl + A 然后按 np 切换到下一个或上一个屏幕。你也可以通过 Ctrl + A 然后按 " 切换到屏幕列表。

4. Dead(死亡)状态

  • 定义:如果一个 screen 会话中的进程因某种原因终止(如程序崩溃),该会话的状态会变成“死亡”。此时,screen 会话将无法再恢复,它已经完全关闭。
  • 清理死会话:可以通过 screen -wipe 来清理已经死掉的会话
  • 标题: Linux 必备的终端复用工具:screen
  • 作者: 三葉Leaves
  • 创建于 : 2024-12-19 00:00:00
  • 更新于 : 2025-01-05 18:48:33
  • 链接: https://kiss1314.top/b6648a27ab2d/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论