如何并行执行多个tar命令?

如何并行执行多个tar命令?

我想使用 shell 脚本压缩四个包含大量小文件的目录。由于此脚本执行时间太长,因此我希望使用 shell 脚本并行运行这 4 个 tar 命令,希望可以更好地利用可用资源。

我当前正在使用的命令:

tar cf - /ebs/uat/uatappl | gzip -c > /ebs/backup/uatappl.tar.gz
tar cf - /ebs/uat/uatcomn | gzip -c > /ebs/backup/uatcomn.tar.gz
tar cf - /ebs/uat/uatora | gzip -c > /ebs/backup/uatora.tar.gz
tar cf - /ebs/uat/uatdata | gzip -c > /ebs/backup/uatdata.tar.gz

答案1

您可以将所有 tar 放在背景中,如下所示:

tar cf - /ebs/uat/uatappl | gzip -c > /ebs/backup/uatappl.tar.gz &
tar cf - /ebs/uat/uatcomn | gzip -c > /ebs/backup/uatcomn.tar.gz &
tar cf - /ebs/uat/uatora | gzip -c > /ebs/backup/uatora.tar.gz &
tar cf - /ebs/uat/uatdata | gzip -c > /ebs/backup/uatdata.tar.gz &

但请注意,您必须有足够的处理器能力和快速磁盘,否则并发性将使总执行时间比连续执行时间长

答案2

&在命令行末尾添加 a 有什么问题吗?

tar cf - /ebs/uat/uatappl | gzip -c > /ebs/backup/uatappl.tar.gz &
tar cf - /ebs/uat/uatcomn | gzip -c > /ebs/backup/uatcomn.tar.gz &
tar cf - /ebs/uat/uatora | gzip -c > /ebs/backup/uatora.tar.gz &
tar cf - /ebs/uat/uatdata | gzip -c > /ebs/backup/uatdata.tar.gz &

wait

wait将等待作业完成。

答案3

您可以使用 GNU Parallel,它是并行执行作业的工具。我已经测试了以下内容,我相信这一行会起作用:

ls -1 /ebs/uat | parallel 'tar cf - /ebs/uat/{} | gzip -c > /ebs/backup/{}.tar.gz'

网页在这里:https://www.gnu.org/software/parallel/,并且快速谷歌似乎表明有可用的Solaris软件包,因此您甚至可能不需要手动安装它。

答案4

既然您添加了 Solaris 标签,那么您使用的是哪个版本?以及您使用什么文件系统?如果是 UFS,您可以迁移到 ZFS,它比 UFS 能更好地处理许多较小的文件。可能是罗氏(Roche)对此进行了基准测试。

即:如果您使用 ZFS,您可以为每个主目录创建一个数据集,并将其复制到不同的文件系统或设置了更高级别压缩的系统。包括可能的重复数据删除。

根据目录结构,所有文件似乎都位于您要备份到的同一个 FS 上。因此,并行选项可能没有任何帮助,因为我怀疑 IO 将成为限制因素,而不是 CPU 资源。

您可以尝试按照 @Romeo Ninov 的建议将工作放在后台。或者甚至为每个目录创建一个脚本并同时运行它们。最后,只有通过尝试和测试各种选项,您才能确定什么可能有助于找到最能满足您需求的选项,也可能没有帮助。包括不同的归档器和压缩算法。

例如,如果速度更重要,请尝试gzip使用 或compress中的较低级别的压缩zip

另外,如果您不认为 CPU 是一个问题,并且有多个,您可以尝试使用 Pigz(gzip 的并行实现)来看看是否有帮助。该 pkg 位于 v11 的支持存储库中,但您必须获取源代码并针对早期版本的 Solaris 进行编译。

Reco 也在timex每个命令前面,因为它可能只是其中一个目录。给你带来缓慢。如果是这样,请集中精力优化这一点。

相关内容