Rails 3.1 + Gem Daemons не позволит мне получить доступ к моей базе данных - PullRequest
5 голосов
/ 17 марта 2012

Я пытаюсь настроить демон для моего приложения Rails 3.1, работающего на сервере Ubuntu.Просто что-то вроде этого:

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: ActiveRecord::Base.logger = ActiveSupport::BufferedLogger.new('/path/to/log/file.log')
  3. Затем я получил третью ошибку, и решение состояло в том, чтобы потребовать среду Rails внутри блока run_proc вместо более ранней вскрипт.

Мой последний скрипт выглядит так:

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

Ответы [ 2 ]

1 голос
/ 25 августа 2013

Понятия не имею почему, но это работает, когда я отключаю соединение с базой данных перед демонизацией скрипта, например:

# app env
ENV['RAILS_ENV'] = 'production'
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")

# disconnect first
ActiveRecord::Base.connection.disconnect!

# Become a daemon
Daemons.daemonize

# connect again
ActiveRecord::Base.establish_connection ENV['RAILS_ENV']

# ... do what you need

Надеюсь, это поможет.

1 голос
/ 17 марта 2012

Чтобы правильно предварительно загрузить среду Rails (зависимости) для скрипта, запустите его следующим образом:

bundle exec my_script_ctl start
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...