我在根目录中有一个文件夹 Backissues/。该文件夹的大小要大得多,大约有 132G。如果我运行命令zip -r backissue.zip Backissues/
它花费了太多时间,几个小时后就会出现某种断开连接的情况。你可以假设我对 SSH 命令的了解不够。只需按照几个教程就可以完成任务。或者是否可以将文件夹拆分为拆分文件。我尝试将 zip 压缩到包含不多文件的文件夹中,例如大约 250m。这很完美,我可以下载文件并在其他地方重新使用。我在共享托管环境中
该文件夹的组织方式为 1991 1992 1993
答案1
这实际上不是一个 ssh 问题;ssh 在这里成为一个问题的原因是由于该操作花费了太多时间而导致超时。
您的主要问题(超时)可以通过使用 background 和 nohup 来解决。zip -r backissue.zip Backissues/
您无需执行,而是执行
nohup zip -r backissue.zip Backissues/ &
这会做两件事:尾随&
使 zip 进程在后台执行,并且nohup
断开 zip 进程与您正在使用的连接,以便您的 ssh 断开连接不会中断进程的执行zip
。只要您的连接保持打开,您就可以使用jobs
bash 命令来管理后台 zip 命令,但是一旦您注销或您的 ssh 连接中断并且您必须重新连接,您将必须使用ps
或检查您的进程,以及该命令创建的top
文件中的输出。您必须这样做,记住该作业可能仍在后台运行,因为如果您在另一个进程仍在执行时重新启动一个进程,您可能会遇到不必要的问题。nohup.out
nohup
我对以上内容有两点改进。
改用这个命令:
nohup bash -c "zip -r backissue.zip Backissues/ && touch backissue.finished" &
将为您留下一个提示文件,保证长时间运行的 zip 操作正确完成。否则,您必须依靠 中显示的错误nohup.out
,或者zip
仅在该过程成功完成时将输出文件重命名为其预期名称。
在任何情况下,您都可以使用zip
命令的功能将输出文件拆分成几部分,但我想您有很多旧刊。一种改进方法是,不要将所有内容都制作成一个 zip 文件,而是为每个旧刊制作一个 zip 文件(假设您的目标是减少空间,而不是简单地获取单个文件)。这会将工作分解为不同的部分,这些部分可以单独执行,并且会分别失败。这也是更好的做法:当您有新的旧刊时,您不需要重新做整个存档,当您需要访问旧刊时,只需解压所需的那个。当然,要做到这一点,您需要知道 Backissues 文件夹的结构。
您补充说(如果我理解正确的话),Backissues 文件夹的组织方式如下:
Backissues/1991
Backissues/1992
Backissues/1993
...
Backissues/2019
这意味着,如果您year=1991 ; nohup zip -r Backissues.$year.zip Backissues/$year/ &
在所有年份都重复书写,等待前一年完成,以免服务器超载,那么您每年将获得一个 zip 文件,这应该是可管理的,而无需进一步拆分文件。
当然,情况可能会更复杂。例如,您可以使用如下脚本:
#!/bin/bash
if [ ! -d Backissues ] ; then
echo Move to correct folder >&2
exit 1
fi
mkdir -p Backissues.compressed
cd Backissues
for year in [0-9][0-9][0-9][0-9] ; do
zipfile="../Backissues.compressed/$year.zip"
if [ ! -f $zipfile ] ; then
zip -r $zipfile $year && echo "Compressed $year successfully"
fi
done
此脚本可以在任何时候执行,但是一旦执行,年度档案将不会自动重新创建。
精通 shell 脚本编程的人将能够根据您的操作需求对其进行自定义(一次只存档一年,直到最后一期发布才对当前年份进行存档,或者使用最新一期更新相关存档,在完全确定存档正确后删除原始内容以节省空间,将备份复制到一些安全的存储空间 - 在 S3 Glacier Deep Archive 上,您的 132 GB 每年的费用不到 2.00 美元,所有这些都是自动完成的......)
答案2
这可能是因为您的 SSH 连接由于长时间没有发送数据而超时。您可以通过告诉 SSH 客户端在连接空闲时发送保持活动数据包来防止这种情况。
设置此选项的具体方式取决于您使用的 SSH 客户端。例如,使用 OpenSSH 您可以这样写:
$ ssh -o ServerAliveInterval=25 your.server.address
这将在连接空闲时每 25 秒发送一次 keepalive 以防止其断开连接。这记录在ssh_config 手册页。