2013-08-07 90 views
0

我有一個應用程序在彈性beanstalk和cron作業上。彈性豆稈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('[email protected]'); 
$m->setFrom('[email protected]'); 
$m->setSubject('test message'); 
$m->setMessageFromString('', 'message content'); 
$send_emails=($ses->sendEmail($m)); 

當我打電話http://site.com/cronscript/從瀏覽器的地址欄,我收到一個消息,因爲我想要的。

回答

0

我相信發生的事情是,第一次部署應用程序時,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來測試它是否是領導者實例。

希望它有幫助。