跨服务器传输大文件,利用 scp 与 screen 保证不中断的文件上传

在 Linux 环境中,我们时常需要传输一些大型数据集或权重文件,尤其是涉及到很多碎片文件时,传输的时间可能会非常长。为了避免传输中因为网络断开或者其他原因导致任务中止,可以借助 screen 工具。本文将向你介绍如何使用 screen 来保持文件传输任务的持续性,以确保文件上传可以稳定完成。

为什么需要 screen

假设你有一个项目文件夹,位于源服务器上,现在需要通过 scp 命令将整个文件夹传输到目标服务器。文件夹中包含大量数据集和模型权重,传输时间预计会非常长。传统的方法有几个缺点:

  1. 连接中断:如果网络突然中断,你的传输任务将会终止,并且需要从头开始。
  2. 长时间等待:传输过程可能需要几小时甚至更久,你不可能一直保持连接状态。
  3. 无恢复机制:即使只是网络中断几秒钟,你的传输任务也会终止,这意味着需要从头再来,浪费了时间和资源。

为了解决这些问题,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)到后台。

这样你可以关闭终端窗口,而不影响文件传输任务的继续进行。

扫描二维码关注公众号,回复: 17492391 查看本文章

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_sessionscreen 会话。

扩展操作

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 然后按数字键(例如 012 等)直接切换到指定窗口。
  • 使用 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 还允许多个用户共享同一个会话,这在合作调试或教学场景中非常有用。

共享会话步骤
  1. 启动共享会话:首先以常规方式启动一个 screen 会话,并设置允许共享的权限:

    screen -S shared_session
    

    screen 中按下 Ctrl + A,然后输入 :multiuser on

  2. 设置权限:确保 /var/run/screen 目录对共享用户是可访问的,你还需要用 acladd 命令为共享用户添加权限:

    Ctrl + A, 然后输入 :acladd 用户名
    

共享会话允许多个用户同时看到和操作同一终端,适合远程合作或调试。

总结

在长时间传输文件时,screen 是一个非常有用的工具,尤其是在你可能无法保持持续连接的情况下。它允许你在后台运行任务,即使网络断开,任务也不会中止。这对于传输大量数据集和模型权重等关键文件尤其重要。

简单总结这个过程:

  1. 启动 screen 会话screen -S scp_upload_session
  2. 执行 scp 命令:完成文件传输任务。
  3. 放入后台Ctrl + A,然后按 D
  4. 重新连接 screenscreen -r scp_upload_session
  5. 结束会话:传输完成后,输入 exit

screen 的灵活性不仅适用于文件传输,还非常适合管理其他长时间执行的任务,如代码编译、脚本运行等。它的可靠性和简便性使其成为 Linux 用户在远程任务管理中的得力工具

猜你喜欢

转载自blog.csdn.net/qq_22841387/article/details/143117356