所有“aws s3”下载完成后如何收到通知?

所有“aws s3”下载完成后如何收到通知?

我将使用 bash 文件运行大量 aws s3 下载

aws s3 cp s3://my-bucket/file0001.txt file0001.txt &
aws s3 cp s3://my-bucket/file0002.txt file0002.txt &
aws s3 cp s3://my-bucket/file0003.txt file0003.txt &
...

当然,如您所知,&最后的 将使aws s3命令成为非阻塞的。

有没有一种好的方法可以让我在所有这些非阻塞调用完成时收到通知? aws 是否提供任何监控总体进度的方法?

答案1

最后,我编写了一个 python 脚本,以确保在任何给定时间只会发生 10 个并发 s3 下载

#!/usr/bin/env python3
import os
import sys
import boto3
from multiprocessing import Pool


BUCKET = "my-bucket"

s3 = boto3.client("s3")


def download_s3_file(params):
    """ If the files exists, assume download is already performed and done
    """
    src, dest = params
    if os.path.exists(dest) and os.path.isfile(dest):
        print(f"The file {dest} is already downloaded ")
        return
    print("Downloading", BUCKET, src, dest)
    print("process id:", os.getpid())
    try:
        s3.download_file(BUCKET, src, dest)
    except Exception as e:
        print(e)


def main():
    filelist = sys.argv[1]
    print("parent process:", os.getpid())
    print("Working on ", filelist)
    jobs = []
    for l in open(filelist, "r"):
        # Ignore commented lines
        if not l.startswith("#"):
            src, dest = l.strip().split(",")
            jobs.append((src, dest,))
    with Pool(10) as p:
        p.map(download_s3_file, jobs)


if __name__ == "__main__":
    main()

答案2

如果你这样做他们中的很多人您的本地盒子很快就会超载,因为您将开始很多过程同时。

最好执行以下操作之一:

  • 如果文件有一些共同的前缀,则进行递归复制:

    aws s3 cp --recursive s3://my-bucket/path/ .
    
  • 创造性地使用aws s3 cp --excludeand --include- 即排除除包含列表中指定的内容之外的所有内容。

    aws s3 cp --recursive --exclude '*' \
              --include 'path1/file1.txt' --include 'path2/file2.txt' \
              s3://my-bucket/ .
    
  • 利用s3cmd --include-from file.txt它允许您将所需的文件名放入输入文件中。

    ~ $ cat include-filenames.txt
    path1/file1.txt
    path2/file2.txt
    
    ~ $ s3cmd get --recursive --exclude '*' \
                  --include-from include-filenames.txt \
                  s3://my-bucket/ .
    

不,AWS 不提供任何方法来监控它 - 它在您的本地笔记本电脑/服务器上运行,您必须在那里监控它。

希望有帮助:)

相关内容