cron作业中的Rails类方法在弹性beantalk中不起作用

Posted

技术标签:

【中文标题】cron作业中的Rails类方法在弹性beantalk中不起作用【英文标题】:Rails class method in cron job not working in elastic beanstalk 【发布时间】:2018-06-15 11:54:18 【问题描述】:

我有一个需要每 15 分钟运行一次的类方法,我有 cron 作业

0,15,30,45 * * * * /bin/bash -l -c 'cd /var/app/current && sudo /opt/rubies/ruby-2.3.5/bin/bundle exec /opt/rubies/ruby-2.3.5/bin/rails runner -e production '\''Structure.check_parking'\'' >> /var/app/current/log/cron_log 2>&1'

在我的弹性 beanstsalk 环境中运行,但我不断收到错误

/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/mysql2-0.4.4/lib/mysql2/client.rb:87:in `connect': Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

我在生产环境中使用 RDS 服务器,所以它尝试连接到本地 mysql 服务器很奇怪。

rails 应用程序已连接到数据库,我可以在其上执行所有正常功能,但是当我尝试运行此类方法时出现此错误。

我的猜测是它没有在生产中运行,但我真的不确定,我的 database.yml 文件看起来像

development:
    adapter: mysql2
    database: bddatabase
    encoding: utf8
    username: bduser
    password: dbpass
    host: 127.0.0.1
    port: 3306

production:
    adapter: mysql2
    encoding: utf8
    database: <%= ENV['RDS_DB_NAME'] %>
    username: <%= ENV['RDS_USERNAME'] %>
    password: <%= ENV['RDS_PASSWORD'] %>
    host: <%= ENV['RDS_HOSTNAME'] %>
    port: <%= ENV['RDS_PORT'] %>

一直在尝试解决这个问题,非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

我想通了,原来我的 cron 任务本身存在问题。我认为我是如何引用 bundle 和 rails 的方式并没有指向导致错误的我的应用程序。将命令更改为

0,15,30,45 * * * * /bin/bash -l -c 'cd /var/app/current && bundle exec rails runner -e production 'Structure.check_parking' >> /var/app/current/log/cron_log 2>&1'

成功了

【讨论】:

你能告诉我你最初是如何设置 cron 任务的吗? 这是一个特定于 Rails 的问题吗?或者只是如何设置 cron 作业? 对不起,应该更具体。我更想知道您如何在 Elastic Beanstalk 中设置 cron 作业 知道了,我主要关注这个***.com/questions/14077095/…。理想情况下,您应该有一个单独的服务器,它只运行 cronjob,但对我们来说,在给定的时刻,我们只有一个实例。 eb 中的 cronjobs 的问题是,当创建一个新实例时,cron 作业现在将在两者上运行。有办法解决这个问题,但理想情况下你应该有一个单独的实例。

以上是关于cron作业中的Rails类方法在弹性beantalk中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

弹性豆茎和 django 的 Cron 作业

使用弹性 beantalk 和 SQS 处理失败的 cron 作业

AWS弹性beantalk cron作业

Ruby on Rails Cron 作业示例

每当 Gem 的 Cron 作业在亚马逊弹性豆茎中失败

如何在 Rails 4 上实现类似 cron 作业