在 aws beanstalk rails 容器上安排 cron 作业

Posted

技术标签:

【中文标题】在 aws beanstalk rails 容器上安排 cron 作业【英文标题】:schedule cron job on aws beanstalk rails container 【发布时间】:2013-03-28 23:22:33 【问题描述】:

我正在使用只要 gem 来配置我的 crontab 并安排 cron 作业。我的 config/schedule.rb 文件有以下内容:

set :environment, "test"
set :output, :error => "/var/log/cron_error.log", :standard => "/var/log/cron_log.log"

every 1.minutes do
   runner 'TickerSymbol.update_prices'
end

目前我正在 TickerSymbol.update_prices 方法中调用 Rails.logger.debug ...。另外,请注意 schedule.rb 文件中我正在尝试将计划的 cron 作业的输出写入 /var/logs/*.log。这是行不通的。当我在 S3 上或通过 Beanstalk 管理控制台查看日志时,我会看到 /var/log 目录中的其他日志文件,但看不到我的 cron 日志文件。

我的 .ebextensions/[app name].config 文件有以下内容:

sources: 
  /aws-scripts-mon: http://ec2-downloads.s3.amazonaws.com/cloudwatch-samples/CloudWatchMonitoringScripts.zip

option_settings:
  - option_name: AWS_SECRET_KEY
    value: XXX
  - option_name: AWS_ACCESS_KEY_ID
    value: XXX
  - option_name: BUNDLE_WITHOUT
    value: "production:development"
  - option_name: RACK_ENV
    value: test
  - option_name: RAILS_ENV
    value: test
  - option_name: RAILS_SKIP_MIGRATIONS
    value: true

container_commands:
  01-setupcron:
    command: echo "*/5 * * * * root perl /aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --aws-access-key-id $AWS_ACCESS_KEY_ID --aws-secret-key $AWS_SECRET_KEY > /dev/null" > /etc/cron.d/cwpump
  02-changeperm:
    command: chmod 644 /etc/cron.d/cwpump
  03-changeperm:
    command: chmod u+x /aws-scripts-mon/mon-put-instance-data.pl
  04-rake_routes:
    command: rake routes
  05-whenever:
    command: whenever -c
    command: whenever -i [app name] --update-crontab
    command: whenever -f
    command: crontab -l
    leader_only: true

以下是我在部署期间使用 git aws.push 生成的日志文件中的内容。此日志条目确认无论何时按预期生成 crontab 文件。

2013-04-06 14:50:37,469 [DEBUG] Running command 05-whenever
2013-04-06 14:50:37,470 [DEBUG] Generating defaults for command 05-whenever
<<<

2013-04-06 14:50:37,639 [DEBUG] Running test for command 05-whenever
2013-04-06 14:50:37,654 [DEBUG] Test command output: 
2013-04-06 14:50:37,654 [DEBUG] Test for command 05-whenever passed
2013-04-06 14:50:37,671 [INFO] Command 05-whenever succeeded
2013-04-06 14:50:37,671 [DEBUG] Command 05-whenever output: # Begin Whenever generated tasks for: [app name]
0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 * * * * /bin/bash -l -c 'cd /var/app/ondeck && script/rails runner -e production '\''TickerSymbol.update_prices'\'' >> /path/to/my/cron_log.log 2>&1'


# End Whenever generated tasks for: [app name]

我错过了什么吗?根据当前配置,我希望在 /var/log/cron_log.log 文件中看到来自 TickerSymbol.update_prices 的日志消息。但是,我没有看到这些设置产生错误的任何迹象,也没有看到 cron 作业正在运行的任何迹象。

【问题讨论】:

【参考方案1】:

看看上一条日志的输出:

... cd /var/app/ondeck ...

此目录仅在部署期间存在。如果您的 crontab 像它说的那样设置为 CD,它将无法工作。

【讨论】:

以上是关于在 aws beanstalk rails 容器上安排 cron 作业的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS 弹性 beanstalk 上部署 Rails - 静态资产路由不起作用

在 AWS Elastic Beanstalk / Rails 上配置 HTTPS

如何在 AWS Elastic Beanstalk 上使用 Resque 运行 Rails 后台作业?

在 AWS Elastic Beanstalk 上部署 Rails / Ember 应用程序

Rails 应用程序无法在 AWS Elastic Beanstalk 上运行,sqlite3 错误

使用 AWS 弹性 beanstalk 负载均衡器在 Rails 上实施 https 连接