mysql - Rails 3.1 + Daemons gem 不允许我访问我的数据库

标签 mysql ruby-on-rails ruby-on-rails-3 scripting ruby-on-rails-3.1

我正在尝试为我在 Ubuntu 服务器上运行的 Rails 3.1 应用程序设置守护进程。就像这样简单的事情:

require File.expand_path('../../config/environment',  __FILE__)
require 'rubygems'
require 'daemons'

Daemons.run_proc('my_script') do
  loop do
    puts BlogPost.count
    sleep(5)
  end
end

但是当我到达 BlogPost.count 时,出现以下错误:

/usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:283:in `query': Mysql2::Error: MySQL server has gone away: SHOW FIELDS FROM `blog_posts` (ActiveRecord::StatementInvalid)
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:283:in `execute'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract_adapter.rb:244:in `log'
from /usr/lib/ruby/gems/1.8/gems/activesupport-3.1.0/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract_adapter.rb:239:in `log'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:283:in `execute'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:473:in `columns'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:95:in `initialize'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:185:in `with_connection'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:92:in `initialize'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/base.rb:706:in `call'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/base.rb:706:in `default'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/base.rb:706:in `[]'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/base.rb:706:in `columns'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/base.rb:722:in `column_names'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/relation/calculations.rb:192:in `aggregate_column'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/relation/calculations.rb:213:in `execute_simple_calculation'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/relation/calculations.rb:187:in `perform_calculation'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/relation/calculations.rb:155:in `calculate'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/relation/calculations.rb:58:in `count'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/base.rb:445:in `__send__'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.1.0/lib/active_record/base.rb:445:in `count'
from script/background_job_processor_control.rb:22

知道为什么我的脚本无法连接到 MySQL 吗?如果我将 BlogPost.count 代码放在 Daemons.run_proc 之前,我就可以很好地连接到 MySQL。

------------ 编辑:已解决! --------------

对于任何对解决方案感到好奇的人,我必须做三件事才能让它发挥作用:

  1. 在启动/停止我的守护程序时包含 bundle exec:RAILS_ENV=production bundle exec myscript.rb start
  2. 此时我不再收到 MySQL2 错误,但开始收到记录器错误。解决方案是在 run_proc block 中添加以下代码:ActiveRecord::Base.logger = ActiveSupport::BufferedLogger.new('/path/to/log/file.log')
  3. 然后我遇到了第三个错误,解决方案是在 run_proc block 中而不是在脚本的前面要求 Rails 环境。

我的最终脚本如下所示:

require 'rubygems'
require 'daemons'

Daemons.run_proc('my_script') do 
  require File.expand_path('../../config/environment',  __FILE__)
  ActiveRecord::Base.logger = ActiveSupport::BufferedLogger.new('/path/to/log/file.log')
  loop do
    puts BlogPost.count
    sleep(5)
  end
end

最佳答案

要为脚本正确预加载 Rails 环境(依赖项),请按如下方式启动它:

bundle exec my_script_ctl start

关于mysql - Rails 3.1 + Daemons gem 不允许我访问我的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9749449/

相关文章:

php - 选择带有 sport=padel 的所有行

mysql - Sequelize 多连接中的排序错误

ruby-on-rails - CentOS *** 错误 : Phusion Passenger doesn't seem to be running

ruby-on-rails-3 - Rails 3 响应 header

java - 使用 @JoinTable 的 Hibernate 一对多映射问题

php - 需要帮助来编写搜索查询

ruby-on-rails - 如何用 bootstrap 的模态显示 'Delete Confirm Dialog' ?不像浏览器的默认设置

mysql - Rails 部署 - 数据库未上传

ruby-on-rails-3 - 为什么考虑_all_requests_local 使用 rspec 配置失败

ruby-on-rails-3 - 我需要 :presence=>true on my model if I have :length=>{:minimum=>1, :maximum=>255}?