use*_*630 2 cron response amazon-elastic-beanstalk
我有一个关于弹性 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
Run Code Online (Sandbox Code Playgroud)
此脚本调用邮件发件人。我每次收到两条消息。
代码 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));
Run Code Online (Sandbox Code Playgroud)
当我http://site.com/cronscript/从浏览器的地址栏呼叫时,我会根据需要收到一条消息。
我相信正在发生的事情是,当您第一次部署应用程序时,AutoScaling 会选择一个实例作为领导者,并在该实例上创建新的 cron 作业。下次部署应用程序时,AutoScaling 会选择另一个实例作为领导者。因此,您最终会在两个实例上执行相同的 cron 作业。
所以基本的测试是通过 ssh 连接到所有实例并检查它们的crontab内容crontab -l
您可以通过删除实例上的旧 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
Run Code Online (Sandbox Code Playgroud)
如在 Elastic Beanstalk Auto-Scaling Environment中运行 Cron 中所述:|| exit 0是强制性的,因为如果机器中没有 crontab,该crontab -r命令将返回状态代码 > 0(错误)。如果 container_commands 之一失败,Elastic Beanstalk 将停止部署过程。
虽然我个人从未遇到过crontab在 Elastic Beanstalk Instance 上找不到的情况。
您可以运行/opt/elasticbeanstalk/bin/leader-test.sh以测试它是否是领导者实例。
希望能帮助到你。