因此,在我的工作中,我们必须将大量文件从旧服务器复制到新服务器。我必须传输两个数据备份,每个备份都有约 200000 个文件,累计大小超过 20GB。有大量小文件,没有大文件,所以 scp 我认为是进行此传输的正确方法。
但是,当我远程 ssh 登录到我的 server2 并将 server1 中的文件 scp 到其中时,我看到这些文件正在我的终端中访问。然而,当我离开办公室时,我不得不断开 WiFi 连接,所以终端现在显示一个损坏的管道。因此,我无法知道 scp 进程是否仍在运行或还剩多少。我可以随着时间的推移改变目录大小,但我想知道是否有更好的方法?我们可以在我的终端上显示正在运行的进程吗?
我对我的第一个数据集做了这个,我还没有开始第二个数据集的过程。在启动命令之前/同时我可以做些什么来防止/解决大型SCP的此类问题?
另外,这可能会持续多少天?一台服务器是 AWS,另一台服务器是 Google,如果这很重要的话。
答案1
使用rsync
。
rsync -av --progress /from/dir/ server:/to/dir/
答案2
我将回答@hschou 未回答的不同部分。
因此,我无法知道 scp 进程是否仍在运行或还剩多少。
我们可以在我的终端上显示正在运行的进程吗?
要获取正在运行的进程列表,您可以使用命令ps
(手册页)
ps aux | grep scp
要监视它,您可以使用命令watch
或自己做一个简单的循环
while true; do clear; ps aux | grep scp; sleep 5; done
这将ps aux | grep scp
每 5 秒运行一次。
答案3
您可以使用 scp 从使用后台进程的 shell 脚本发送大量(小)文件,以实现良好的性能。
使用信号量(标记)文件,例如 filename 和 filename.done。当接收作业看到 filename.done 时,它知道 filename 已完全传输。
shell 脚本可以从输入目录获取一对文件,移动到工作目录,并执行后台函数来传输该对。
后台函数通过一个 scp 命令传输该对,因此该操作是[准]原子的,然后检查 scp 返回码。成功后,将其移至备份位置并退出。如果失败,请将其移回原始输入目录,以便再次尝试时可以将其拾取。处理软错误的便捷方法。
配置并发子进程的数量限制。启动几个,检查有多少个正在运行(pstree),如有必要,请等待以将子 pid 的数量保持在限制范围内。
充分使用日志记录功能会很有帮助。