【问题标题】:elastic beanstalk cron run twice弹性豆茎 cron 运行两次
【发布时间】:2023-04-07 21:43:01
【问题描述】:

我有一个关于弹性 beantalk 和 cron 作业的应用程序。

设置cron的代码是

container_commands:
  01_some_cron_job:
    command: "echo '*/5 * * * * wget -O - -q -t 1 http://site.com/cronscript/' | crontab"
  leader_only: true

此脚本调用邮件发件人。我每次收到两条消息。

http://site.com/cronscript/ 的代码看起来像(php 代码)

require_once('ses.php');
$ses = new SimpleEmailService(EMAIL_SHORTKEY, EMAIL_LONGKEY);
$m = new SimpleEmailServiceMessage();
$m->addTo('user@domain.com');
$m->setFrom('response_service@domain.com');
$m->setSubject('test message');
$m->setMessageFromString('', 'message content');
$send_emails=($ses->sendEmail($m));

当我从浏览器的地址栏中调用http://site.com/cronscript/ 时,我会收到一条我想要的消息。

【问题讨论】:

    标签: cron response amazon-elastic-beanstalk


    【解决方案1】:

    我相信发生的情况是,当您第一次部署应用程序时,AutoScaling 会选择一个实例作为领导者,并在该实例上创建新的 cron 作业。下次部署应用程序时,AutoScaling 会选择另一个实例作为领导者。因此,您最终会在两个实例上执行相同的 cron 作业。

    因此,基本测试是通过 ssh 连接到所有实例并使用 crontab -l 检查它们的 crontab 内容

    您可以通过删除实例上的旧 cron 作业来避免重复的 cron 作业,无论它是否是领导者。

    container_commands:
      00_remove_old_cron_jobs:
        command: "crontab -r || exit 0"
      01_some_cron_job:
        command: "echo '*/5 * * * * wget -O - -q -t 1 http://example.com/cronscript/' | crontab"
        leader_only: true
    

    Running Cron In Elastic Beanstalk Auto-Scaling Environment 中所述:|| exit 0 是强制性的,因为如果机器中没有 crontab,crontab -r 命令将返回状态代码 > 0(错误)。如果 container_commands 之一失败,Elastic Beanstalk 会停止部署过程。

    虽然我个人从未遇到过在 Elastic Beanstalk 实例上找不到 crontab 的情况。

    您可以运行/opt/elasticbeanstalk/bin/leader-test.sh 来测试它是否是领导者实例。

    希望对你有帮助。

    【讨论】:

    【解决方案2】:

    我遇到了同样的问题,只需将用户从 root 更改为我使用 eb ssh 登录的用户即可。 我的代码如下所示。

    files:
    "/etc/cron.d/mycron":
        mode: "000644"
        owner: ec2-user
        group: ec2-user
        content: |
            30 1 * * * echo $(date) >> /tmp/cron_start.log; /usr/local/bin/daily_script.sh >> /tmp/crons.log 2>&1;
    
    
    
    "/usr/local/bin/daily_script.sh":
        mode: "000755"
        owner: ec2-user
        group: ec2-user
        content: |
            #!/bin/bash
    
            date > /tmp/date
            # Your actual script content
            /opt/python/run/venv/bin/python3 /opt/python/current/app/cronjob_files/email_data.py >> /opt/python/current/app/cron.logs 2>&1
    
            exit 0
    

    ...

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 2020-01-21
      • 2020-11-16
      • 2015-03-20
      • 2023-03-19
      • 2015-11-11
      • 2016-01-04
      • 2018-02-25
      • 2019-11-06
      相关资源
      最近更新 更多