linux 在弹性豆茎上每天运行一个简单的cron作业的最新方法是什么?

nnsrf1az  于 2022-12-11  发布在  Linux
关注(0)|答案(1)|浏览(103)

我知道这个问题以前也有人问过,但是在过去的十年里,答案已经改变了很多次,对于这个问题的不太具体的版本,有很多方法。
我在Elastic Beanstalk上部署了一个Python应用程序(Python 3.8运行在64位Amazon Linux 2/3.4.1上)。
我需要每天至少拉一次数据,我有一个函数可以拉数据,我可以用python或者shell脚本调用它。
我该如何设置?

kqqjbcuj

kqqjbcuj1#

你必须把.ebextensions一个文件如下:
cron.config

packages: 
  yum:
    jq: [] 

files:
  "/usr/local/bin/test_cron.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash
      INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id 2>/dev/null`
      REGION=`curl -s http://169.254.169.254/latest/dynamic/instance-identity/document 2>/dev/null | jq -r .region`

      # Find the Auto Scaling Group name from the Elastic Beanstalk environment
      ASG=`aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" \
          --region $REGION --output json | jq -r '.[][] | select(.Key=="aws:autoscaling:groupName") | .Value'`

      # Find the first instance in the Auto Scaling Group
      FIRST=`aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names $ASG \
          --region $REGION --output json | \
          jq -r '.AutoScalingGroups[].Instances[] | select(.LifecycleState=="InService") | .InstanceId' | sort | head -1`

      # If the instance ids are the same exit 0
      [ "$FIRST" = "$INSTANCE_ID" ]

  "/usr/local/bin/my_cron.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash
      /usr/local/bin/test_cron.sh || exit
      # Now run commands that should run on only 1 instance.
      cd /var/app/current
      sudo -u ec2-user your_funtion

  "/etc/cron.d/my_cron":
    mode: "000644"
    owner: root
    group: root
    content: |
      15 7 * * * root /usr/local/bin/my_cron.sh

commands:
  rm_old_cron:
    command: "rm -fr /etc/cron.d/my_cron.bak"
    ignoreErrors: true

在上面的代码中:

sudo -u ec2-user your_funtion

您应该在此处输入要运行的函数的路径,并且:

15 7 * * * root /usr/local/bin/my_cron.sh

在我的示例中,cron任务在每天上午7:15执行,因此您应该使用linux cron命令语法设置时间。
test_cron. sh例程用于确定是否有多个EC2示例正在运行,在这种情况下,避免在多个示例中执行cron作业。(此部分摘自AWS文档)。
要执行test_cron.sh例程,EC2示例应具有权限集,这是通过将以下策略添加到IAM中的aws-elasticbeanstalk-ec2-role角色来完成的(您在环境启动期间已由EB创建了此角色):

{
"Version": "2012-10-17",
   "Statement": [
     {
       "Sid": "Stmt1409855610000",
       "Effect": "Allow",
       "Action": [ "autoscaling:DescribeAutoScalingGroups" ],
       "Resource": [ "*" ]
     },
     {
       "Sid": "Stmt1409855649000",
       "Effect": "Allow",
       "Action": [ "ec2:DescribeTags" ],
       "Resource": [ "*" ]
     }
   ]
}

相关问题