语境 :
我有一个网络服务器(我的托管服务提供商是 OVH)。
我有包含许多文件的大文件夹在许多子目录中(100k+ 个文件)。
我需要移动此目录在我的主机上从一个地方移动到另一个地方。
根据我在互联网和 StackOverflow 上看到的内容,我认为最好的方法是使用动量命令。
确实,我只需要移动整个文件夹及其所有内容(有点像“重命名”),并且我相信我的目标路径位于同一个文件系统上(但我无法确保这一点)。
所以我打算这样做:
mv /home/www/folder1/myfolder /home/www/folder2/myfolder &
(我将使用“&”在后台执行命令而不阻塞)
要执行此命令,我唯一的方法是使用 ssh 命令通过 SFTP 连接到我的网络托管:
ssh username@address
问题 :
当我这样做时(我使用的是 Windows 10),几分钟后就会出现错误(我猜这是因为我没有活动):
Connection reset by <IP_ADDRESS> port 22
我担心的是,在我启动 mv 命令后,由于需要一段时间,我的 ssh 连接将因此错误而关闭......
为了避免关闭连接,我尝试在客户端上创建一个 ~/.ssh/config 文件,其中包含以下内容,正如这里解释的那样:
Host *
ServerAliveInterval 240
我也做了 chmod
chmod 600 ~/.ssh/config
然后,当我尝试从 Windows PowerShell 启动 ssh 连接时,出现错误
Bad owner or permissions on C:\\Users\\antoi/.ssh/config
然后我尝试从 git bash 开始,没有出现这个错误,ssh 连接打开时没有出现错误。
但几分钟后我又出现另一个错误并且我的连接也被关闭了:
attente de données expirée : déconnexion automatique
我没有英文信息,但应该是这样的
expired data wait: automatic logout
问题 :
你能告诉我吗如果我的 mv 命令将继续执行在服务器上即使我的 SSH 连接已丢失?
如果答案是否定的,你知道吗我如何确保我的 ssh 保持活动状态在移动操作过程中?
提前谢谢您,如果没有这些答案,我就无法实现迁移,因为如果我的数据被损坏或处于未知状态,那将太危险了!
答案1
你能告诉我即使我的 SSH 连接丢失,我的 mv 命令是否会继续在服务器上执行吗?
这取决于 Linux 发行版,但最有可能的是 -不。当您在后台运行该进程时,一旦 shell 终止,该进程也会被终止。
如果答案是否定的,那么您知道如何确保在移动操作期间我的 ssh 保持活动状态吗?
我认为最好的方法是不要试图猜测它将运行多长时间,只需在前台运行命令(删除&
):
mv /home/www/folder1/myfolder /home/www/folder2/myfolder
如果您不打算执行任何其他操作并且让 shell 处于不活动状态,为什么要在后台运行该命令?
第二个问题的另一种解决方案是使用 keep-alive,就像您在配置中所做的那样。但是,您收到的所有者或权限错误错误很可能是因为文件所有者错误,因此请尝试执行以下操作:
chown antoi:antoi ~/.ssh/config
(在哪里安托伊是您的用户名)
答案2
如果您的目标是“移动文件”,而不是“保持连接”,那么简单的方法是使用nohup
,即将命令更改为
nohup mv /home/www/folder1/myfolder /home/www/folder2/myfolder &
这样,您可以断开 SSH 会话,并且命令将继续在服务器上运行,尽管您可能需要ps
稍后使用它来检查移动操作是否已完成。
如果您想自动保持连接,您应该检查您使用的 ssh 客户端的相关设置,有些客户端可以定期发送 ping 请求以保持连接。
答案3
如果你正在使用 SSH,你应该查看SCP。 这会不是删除现有文件,但它绝对会复制文件并维持 ssh 连接:
scp -r /本地/目录/用户名@to_host:/远程/目录/
如果您在 Windows 机器上运行副本,我建议您使用 WinSCP 之类的程序。它是 GUI 驱动的,但它具有强大的命令行,您可以使用一些简单的标志来编写传输脚本。
答案4
如果我需要通过 ssh 执行一个需要一些时间的操作,我通常会使用screen
并从其中启动一个命令。其他类似的工具是tmux
。
两者都应该在断开连接后继续存在,并且在重新建立连接后,您仍然应该能够重新连接到会话(因为screen
-r
选项会这样做)。