无法将 aws s3 sync 作为 cron 作业运行

无法将 aws s3 sync 作为 cron 作业运行

我在将 aws s3 sync 作为 cron 任务运行(在 Ubuntu 16.04 上)时遇到了问题。以下是我能够做:

  • 使用 sudo 手动运行 /etc/cron.hourly 目录中的脚本(因此传递环境值似乎没有问题)
  • 在没有 sudo 的情况下在用户目录中手动运行脚本
  • 将脚本或命令本身添加到 /etc/crontab - 使用以下任一项:

    23 * * * * 我的用户名 aws s3 sync /home/我的用户名/temp/ s3://manning2323

    */1 * * * * 我的用户名 /home/dbclinton/myusername/temp/s3script.sh

当然,/etc/crontab 的问题在于它很容易被更新覆盖,因此对于我的目的来说它不够好。

现在让我们来看看没有工作:

  • 将脚本留在 cron.hourly 中并等待它自动运行。它确实运行(作为 syslog 和 journalctl 报告),但 AWS CLI 没有提供我可以看到的任何输出,因此我无法知道同步未发生的原因。我怎么知道同步未发生?因为新文件没有出现在我的 S3 存储桶中。
  • 我使用自己的 crontab 通过 crontab -e 添加此行得到完全相同的结果

    47 18 * * * /home/我的用户名/temp/s3script.sh >> /home/我的用户名/cronlog.txt

你知道我做错了什么吗?谢谢,

答案1

事实证明,由于 cron 在看待 PATH 方面有点不可预测,所以我不得不使用它的绝对地址(/usr/local/bin/aws)在脚本中引用 aws 二进制文件。

答案2

在启用 cron 之前,您可以在会话中配置 aws 凭证,例如:

$ aws configure
AWS Access Key ID [None]: yourAccessKeyID
AWS Secret Access Key [None]: yourSecretAccessKey
Default region name [None]: yourRegion
Default output format [None]: json

因此您可以尝试:

* * * * * /usr/local/bin/./aws s3 sync local/dir s3://my-bucket/path

小心地将用户正确配置为 cron

答案3

Cron 有点要求和具体,这就是我如何使用两种不同的 awscli 安装方法在两个不同的 ubuntu 机器上运行它。

在 Ubuntu 16.04 上通过 PIP 安装

sudo /home/ubuntu/.local/bin/aws s3 sync --region ap-northeast-1 /var/backups/ s3://BUCKET/backups

在通过 apt-get 安装的 Ubuntu 18.04 上,使用用户运行Ubuntu,与用户一起运行时这行不通

sudo /usr/bin/aws s3 sync  --region ap-northeast-1 /var/backups/ s3://BUCKET/backups/

在这两种情况下,--region 都不是必需的,但是为了清楚起见,我将其粘贴进去

答案4

如果您使用 snap 安装 aws console,则绝对/可执行地址将类似于 /snap/bin/aws ,否则它看起来像 /usr/bin/aws 。根据您的安装,它可能有所不同。您可以使用 找到此路径$ whereis aws

例如:

snap/bin/aws s3 sync --exclude "folder/path to exclude" pathtosync s3://bucketname/objects

相关内容