linux:告别SSH断线烦恼,Screen命令核心使用指南
引言
在远程服务器上工作时,我们最怕的就是网络突然断开,一个正在运行的重要脚本或编译任务可能就此中断,前功尽弃。GNU Screen工具就是为了解决这个问题而生的。它就像一个“虚拟终端”的管理器,让我们可以在一个终端窗口中创建多个独立的会话(Session),并且可以随时“分离”(detach)和“恢复”(reattach),即使我们关闭了当前的SSH连接,里面的程序也会持续在后台运行。
看了 screen --help
感觉眼花缭乱是很正常的,它的参数确实非常多,但我们日常高频使用的其实就那么几个。
核心概念:会话(Session)与窗口(Window)
要理解screen
,我们首先要搞清楚两个核心概念:
- 会话 (Session): 当我们启动
screen
时,我们就创建了一个会话。这是一个大的容器,可以独立于我们的终端存在。我们可以断开连接,这个会话和里面的所有进程都会继续在服务器上运行。 - 窗口 (Window): 在一个会话内部,我们可以创建多个窗口,每个窗口都像一个独立的命令行终端(Shell)。这就像浏览器的标签页,让我们可以在不同任务之间轻松切换。
下面,我们就来看看如何通过几个简单的命令玩转screen
。
创建一个新的Screen会话
这是我们使用screen
的第一步。最简单的方式是直接输入screen
,但这通常不够直观,因为当我们有多个会话时,很难区分它们。
常用命令:screen -S [session_name]
这个命令中的 -S
参数(S是大写的)允许我们为一个会话命名,强烈推荐每次都这样做。 这样可以让我们清晰地知道每个会话是用来做什么的。
示例:
假设我要开始一个编译项目的工作,我会创建一个名为 compiler
的会话:
dave@gitlab-runner:~$ screen -S compiler
执行后,我们会进入一个新的、看起来和之前一模一样的终端界面。但别担心,我们已经在一个受screen
保护的会话里了。
分离(Detach)当前会话
这是screen
的精髓所在。当我们需要暂时离开,但又想让会话中的任务继续运行时,就可以“分离”它。
常用快捷键:Ctrl+a
然后按 d
这个组合键的意思是:先同时按下Ctrl
和a
键,然后松开,再按一下d
键(detach的首字母)。
示例:
在刚才的 compiler
会话中,我启动了一个需要长时间运行的编译命令。现在我需要下班回家,于是我按下 Ctrl+a
然后 d
。终端会显示 [detached from 202352.compiler]
,然后返回到我们原来的主终端界面。此时,编译任务仍在服务器上默默运行。
查看所有正在运行的会话
下班回家后,我们重新登录服务器,想看看之前创建的会话还在不在。
常用命令:screen -ls
或 screen -list
这个命令会列出所有当前存在的screen
会话及其状态(Attached或Detached)。
示例:
dave@gitlab-runner:~$ screen -ls
There are screens on:202352.compiler (08/18/25 15:30:00) (Detached)201098.pts-0.gitlab-runner (08/18/25 12:51:32) (Detached)
2 Sockets in /run/screen/S-dave.
看,我们之前创建的 compiler
会话正在安稳地运行,并且处于 Detached
(已分离)状态。
恢复(Reattach)一个已存在的会话
现在,我们想回到之前的 compiler
会话中,查看编译的进度。
常用命令:screen -r [session_name_or_pid]
-r
参数(reattach的首字母)用于恢复一个已分离的会话。我们可以使用会话的PID(如202352
)或者我们之前设置的名字(如compiler
)来指定要恢复哪个会话。 使用名字显然更方便。
示例:
dave@gitlab-runner:~$ screen -r compiler
执行后,我们会立刻回到之前分离时的界面,看到我们的编译任务仍在屏幕上输出日志,仿佛从未离开过。
如果只有一个Detached的会话,我们甚至可以省略会话名,直接用 screen -r
。
在会话内管理窗口
当一个任务变得复杂,我们可能需要在一个会话里同时做几件事,比如一边编译代码,一边查看日志。这时,多窗口功能就派上用场了。
所有在screen
会话内的快捷键都以 Ctrl+a
作为前缀。
Ctrl+a
然后c
: 创建一个新窗口 (create)。Ctrl+a
然后"
: 显示窗口列表,我们可以用上下箭头选择并回车切换。Ctrl+a
然后n
: 切换到下一个窗口 (next)。Ctrl+a
然后p
: 切换到上一个窗口 (previous)。Ctrl+a
然后A
: 重命名当前窗口 (大写的A)。
终止Screen会话
当我们的任务全部完成后,如何彻底关闭一个screen
会话呢?
- 在会话内部:在会话的每个窗口中,像退出普通终端一样输入
exit
命令。当最后一个窗口被关闭时,整个screen
会话就会结束。 - 在会话外部:如果我们不想进入会话再关闭,可以使用
-X
参数发送命令。dave@gitlab-runner:~$ screen -S compiler -X quit
UML 流程图:Screen常用操作流程
为了更直观地理解整个过程,我用UML绘制了一个简单的活动图。
结论
screen
工具的参数虽多,但我们只需要掌握 screen -S
(创建)、screen -ls
(查看)、screen -r
(恢复)这三个核心命令,再配合 Ctrl+a
d
(分离)这个快捷键,就已经能解决90%以上的日常问题了。它就像是我们在Linux服务器上的一个“存档点”,让我们能安心地执行任何耗时任务,而不必担心网络波动带来的意外。希望这份指南能帮助大家快速上手,提升自己的工作效率!