在 Linux 环境中,我们时常需要传输一些大型数据集或权重文件,尤其是涉及到很多碎片文件时,传输的时间可能会非常长。为了避免传输中因为网络断开或者其他原因导致任务中止,可以借助 screen
工具。本文将向你介绍如何使用 screen
来保持文件传输任务的持续性,以确保文件上传可以稳定完成。
为什么需要 screen
?
假设你有一个项目文件夹,位于源服务器上,现在需要通过 scp
命令将整个文件夹传输到目标服务器。文件夹中包含大量数据集和模型权重,传输时间预计会非常长。传统的方法有几个缺点:
- 连接中断:如果网络突然中断,你的传输任务将会终止,并且需要从头开始。
- 长时间等待:传输过程可能需要几小时甚至更久,你不可能一直保持连接状态。
- 无恢复机制:即使只是网络中断几秒钟,你的传输任务也会终止,这意味着需要从头再来,浪费了时间和资源。
为了解决这些问题,screen
工具非常有用。screen
允许你在后台运行任务,并且即使断开了终端连接,任务仍然会继续执行。
什么是 screen
?
screen
是一个终端复用器,可以理解为虚拟终端管理工具。它允许你在一个物理终端内运行多个虚拟终端,并且在终端断开连接的情况下依然保持这些虚拟终端的运行。无论是远程 SSH 连接突然中断,还是你主动关闭了终端窗口,screen
会话中的任务仍然继续运行,这非常适合需要长时间执行的任务,如文件传输、模型训练等。
具体步骤
1. 安装和启动 screen
在大多数 Linux 发行版中,screen
通常是默认安装的。如果你的系统中没有安装,可以使用以下命令来安装:
sudo apt-get install screen # 对于 Debian/Ubuntu 系统
sudo yum install screen # 对于 CentOS/RHEL 系统
安装完成后,我们可以开始启动一个 screen
会话。启动命令如下:
screen -S scp_upload_session
-S scp_upload_session
:给这个会话取一个名字,方便你以后找回。这里我们叫它scp_upload_session
,你也可以根据需要取一个更容易识别的名字。
提示:为了避免混淆,可以为会话指定有意义的名称。
2. 执行文件传输命令
在新创建的 screen
会话中,执行你的 scp
命令来传输文件夹:
scp -i ~/.ssh/id_rsa_gt -P 端口 -r 本地项目文件夹 [email protected]:/root/
-i ~/.ssh/id_rsa_gt
:指定私钥文件,告诉 SSH 客户端使用位于本地的私钥文件,来进行与目标服务器的连接和认证。-P 端口
:指定目标服务器的 SSH 端口。如果默认使用22端口,可以忽略此参数。-r
:递归地传输整个文件夹,确保目录中的所有子目录和文件都被传输。本地项目文件夹
:本地需要传输的文件夹路径。[email protected]:/root/
:目标服务器的用户名、地址和目标路径,表示将文件夹上传到目标服务器的/root/
目录。
在执行命令时,系统可能会提示你输入目标服务器的密码,或者需要确认 SSH 密钥指纹,按提示操作即可。
3. 将 screen
会话放入后台
由于传输过程可能需要很长时间,你可以将 screen
会话放入后台,以便你可以自由地关闭终端或断开连接。按下以下组合键:
Ctrl + A 然后按 D
Ctrl + A
:这是screen
的控制命令前缀,表示即将发送控制命令。D
:表示将当前screen
会话从前台“分离”(detach)到后台。
这样你可以关闭终端窗口,而不影响文件传输任务的继续进行。
![](/qrcode.jpg)
4. 重新连接到 screen
会话
如果你想检查文件传输的进展,可以重新连接到之前的 screen
会话。首先,列出所有正在运行的 screen
会话:
screen -ls
你会看到类似如下的输出:
There is a screen on:
12345.scp_upload_session (Detached)
这里的 12345
是会话 ID,scp_upload_session
是会话的名称。
然后,你可以通过会话 ID 或名字重新连接到会话:
screen -r scp_upload_session
或者通过会话 ID:
screen -r 12345
这样你就回到了之前的 screen
会话中,可以看到文件传输的进度。
5. 终止 screen
会话
当文件传输完成后,你可以手动退出 screen
会话。只需在会话内输入:
exit
这会关闭 screen
会话,并结束这个虚拟终端的所有进程。
如果你想直接从后台删除会话而不进入,可以使用:
screen -X -S scp_upload_session quit
这会强制退出并终止名为 scp_upload_session
的 screen
会话。
扩展操作
1. 重新连接到特定的 screen
会话
当你有多个 screen
会话在运行时,选择正确的会话可能会显得有些混乱。使用 -ls
选项可以查看所有当前存在的会话:
screen -ls
这将列出所有当前会话,包括它们的名称和ID。如果你想要连接到某个特定的会话,使用部分匹配是非常方便的:
screen -r 会话ID或名称的一部分
例如,如果你有一个会话名为 dev_server_1234
,你可以仅通过输入 screen -r dev
连接到它,只要它是唯一匹配的。
提示:为了避免混淆,可以为会话指定有意义的名称,例如:
screen -S my_project
这样下次重新连接时更容易辨认。
2. 创建和管理多个窗口
screen
的一个核心优势是能够在单一会话中创建多个窗口,模拟多任务操作。以下是更详细的窗口管理技巧:
创建新窗口
在已启动的 screen
会话中,使用以下快捷键组合来创建新窗口:
Ctrl + A, 然后按 C
每一个新窗口都像是一个全新的终端,你可以运行完全独立的命令。
切换窗口
你可以快速在不同的窗口之间切换:
- 使用
Ctrl + A
然后按数字键(例如0
,1
,2
等)直接切换到指定窗口。 - 使用
Ctrl + A
然后按N
(Next)或P
(Previous)来在窗口之间依次向前或向后切换。 - 按
Ctrl + A
然后按"
(双引号)可以看到所有窗口的列表,然后选择你想要切换到的窗口。
重命名窗口
为了更方便地管理窗口,你可以为每个窗口指定有意义的名称:
Ctrl + A, 然后按 A
然后输入新的窗口名称,这样可以帮助你快速识别每个窗口的作用。
3. 窗口拆分和并排查看
当你在同一 screen
会话中管理多个任务时,窗口拆分功能可以极大地提升效率。你可以将屏幕拆分为多个区域,类似于 tmux
:
水平拆分
按下以下快捷键组合来进行水平拆分:
Ctrl + A, 然后按 S
这将你的屏幕水平分成两个区域。
垂直拆分
使用垂直拆分需要稍微不同的操作:
Ctrl + A, 然后按 |
这样可以将屏幕垂直拆分。
切换区域
你可以在不同的拆分区域之间进行切换:
Ctrl + A, 然后按 Tab
这会让你在拆分的不同区域中来回切换。
打开窗口到拆分区域
当你在新区域内时,可以通过 Ctrl + A
然后 C
来创建新的窗口或将现有窗口移动到该区域。
4. 会话分离和后台运行
screen
的一个最为人称道的功能就是它的会话分离能力,即使你断开 SSH 连接,任务也不会中断。
分离当前会话
当你需要暂时离开而不想中断当前运行的任务时,可以分离会话:
Ctrl + A, 然后按 D
这样会话将会在后台继续运行,而你可以稍后通过 screen -r
重新连接。
强制连接和清除僵尸会话
如果你的会话由于某些原因未正常退出,会变成一个“僵尸”会话,无法重新连接。这时你可以通过强制重新连接的方式来解决:
screen -D -r 会话名称或ID
这里的 -D
选项会强制断开之前的连接,使得你能够重新连接。
5. 记录会话输出
在某些情况下,你可能希望记录整个会话的输出,比如需要审阅调试日志或保存一些重要操作的记录。可以在 screen
中使用日志记录功能:
启动日志记录
在当前会话中启动日志记录:
Ctrl + A, 然后按 H
这会将所有输出保存到一个文件中,通常默认保存为 screenlog.0
。你可以通过指定不同的日志文件名来保存多个记录。
停止日志记录
再次按 Ctrl + A
然后 H
可以停止日志记录。
6. 自定义 .screenrc
配置文件
你还可以通过修改 ~/.screenrc
文件来设置一些自定义配置,提升 screen
的使用体验:
示例配置
在 ~/.screenrc
中可以进行如下配置:
startup_message off # 禁止启动时的提示信息
defscrollback 5000 # 设置默认的滚动缓冲区行数
hardstatus on
hardstatus alwayslastline "%H:%L %n %t %h %w"
startup_message off
: 禁止每次启动screen
时的欢迎消息。defscrollback 5000
: 设置滚动缓冲区的行数,方便回溯更多历史。hardstatus
配置: 在屏幕底部显示状态栏,方便查看当前窗口信息。
7. 共享会话
screen
还允许多个用户共享同一个会话,这在合作调试或教学场景中非常有用。
共享会话步骤
-
启动共享会话:首先以常规方式启动一个
screen
会话,并设置允许共享的权限:screen -S shared_session
在
screen
中按下Ctrl + A
,然后输入:multiuser on
。 -
设置权限:确保
/var/run/screen
目录对共享用户是可访问的,你还需要用acladd
命令为共享用户添加权限:Ctrl + A, 然后输入 :acladd 用户名
共享会话允许多个用户同时看到和操作同一终端,适合远程合作或调试。
总结
在长时间传输文件时,screen
是一个非常有用的工具,尤其是在你可能无法保持持续连接的情况下。它允许你在后台运行任务,即使网络断开,任务也不会中止。这对于传输大量数据集和模型权重等关键文件尤其重要。
简单总结这个过程:
- 启动
screen
会话:screen -S scp_upload_session
。 - 执行
scp
命令:完成文件传输任务。 - 放入后台:
Ctrl + A
,然后按D
。 - 重新连接
screen
:screen -r scp_upload_session
。 - 结束会话:传输完成后,输入
exit
。
screen
的灵活性不仅适用于文件传输,还非常适合管理其他长时间执行的任务,如代码编译、脚本运行等。它的可靠性和简便性使其成为 Linux 用户在远程任务管理中的得力工具