【问题标题】:How can I pipe a tar compression operation to aws s3 cp?如何将 tar 压缩操作通过管道传输到 aws s3 cp?
【发布时间】:2019-07-17 15:14:35
【问题描述】:

我正在用 bash 编写一个自定义备份脚本以供个人使用。目标是通过 tar/gzip 压缩目录的内容,拆分压缩存档,然后将部分上传到 AWS S3。

几个月前我第一次尝试编写这个脚本时,我能够通过以下方式让它工作:

tar -czf - /mnt/STORAGE_0/dir_to_backup | split -b 100M -d -a 4 - /mnt/SCRATCH/backup.tgz.part
aws s3 sync /mnt/SCRATCH/ s3://backups/ --delete
rm /mnt/SCRATCH/*

这对我的目的很有效,但需要/mnt/SCRATCH 有足够的磁盘空间来存储压缩目录。现在我想改进这个脚本,不必依赖/mnt/SCRATCH 有足够的空间,并做了一些研究。我最终得到了类似的东西:

tar -czf - /mnt/STORAGE_0/dir_to_backup | split -b 100M -d -a 4 --filter "aws s3 cp - s3://backups/backup.tgz.part" -

这几乎可以工作,但我的 S3 存储桶上的目标文件名不是动态的,而且它似乎只是在运行时多次覆盖 backup.tgz.part 文件。最终结果只是一个 100MB 的文件,而预期的几个 100MB 文件以.part0001 结尾。

任何指导将不胜感激。谢谢!

【问题讨论】:

    标签: bash amazon-s3 pipe aws-sdk tar


    【解决方案1】:

    当使用split 时,您可以使用环境变量$FILE 来获取生成的文件名。 见split man page

    --filter=COMMAND
         write to shell COMMAND; file name is $FILE
    

    对于您的用例,您可以使用以下内容:

    --filter 'aws s3 cp - s3://backups/backup.tgz.part$FILE'
    

    (需要单引号,否则会立即进行环境变量替换)

    这将在 aws 上生成以下文件名:

    backup.tgz.partx0000
    backup.tgz.partx0001
    backup.tgz.partx0002
    ...
    

    完整示例:

    tar -czf - /mnt/STORAGE_0/dir_to_backup | split -b 100M -d -a 4 --filter 'aws s3 cp - s3://backups/backup.tgz.part$FILE' -
    

    【讨论】:

    • 这成功了!实际上,在阅读了更多内容后,我确实尝试使用 $FILE 变量,但我使用双引号来包含我的 aws 命令,所以我认为 $FILE 在接受来自管道的数据时存在问题。改成单引号就可以了!
    【解决方案2】:

    您应该能够使用 GNU Parallel 轻松并行地完成它。它具有--pipe 选项,可将输入数据拆分为大小为--block 的块,并将其分配给多个并行进程。

    因此,如果您想使用 100MB 块并并行使用 CPU 的所有内核,并将块号 ({#}) 附加到 AWS 上的文件名末尾,您的命令将如下所示:

    tar czf - something | parallel --pipe --block 100M --recend '' aws s3 cp - s3://backups/backup.tgz.part{#}
    

    parallel -j4 可以只使用 4 个 CPU 内核而不是所有内核。

    请注意,我将 "record end" 字符设置为空,这样它就不会试图避免分割中线,这是它的默认行为,并且比二进制文件更适合文本文件处理像压缩包。

    【讨论】:

    • --bar--pipe 不兼容。这是因为--bar 需要知道总共有多少个工作,因此它必须阅读来自--pipe 的所有内容才能做到这一点——这通常会违背--pipe 的目的。
    猜你喜欢
    • 2021-12-27
    • 2016-10-11
    • 2016-09-17
    • 2019-05-31
    • 2021-12-29
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多