![如何并行执行多个tar命令?](https://linux22.com/image/110739/%E5%A6%82%E4%BD%95%E5%B9%B6%E8%A1%8C%E6%89%A7%E8%A1%8C%E5%A4%9A%E4%B8%AAtar%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我想使用 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
每个命令前面,因为它可能只是其中一个目录。给你带来缓慢。如果是这样,请集中精力优化这一点。