Estoy tratando de configurar un daemon para mi aplicación Rails 3.1 que se ejecuta en un servidor de Unbuntu. Sólo algo tan simple como esto:Rails 3.1 + Daemons joya no me deja acceder a mi base de datos
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
Pero cuando llego a BlogPost.count
, me sale el siguiente error:
/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
Cualquier idea de por qué mi script no se puede conectar a MySQL? Si pongo el código BlogPost.count
antes del Daemons.run_proc
, puedo conectarme a MySQL sin problemas.
---------- EDIT: SOLVED! ------------
Para cualquier persona curioso en cuanto a la solución, que tenía que hacer tres cosas para conseguir que esto funcione:
- Incluir
bundle exec
iniciando/parando mi demonio :RAILS_ENV=production bundle exec myscript.rb start
. - En este punto dejé de obtener el error MySQL2, pero empecé a recibir un error de registrador. La solución fue agregar el siguiente código bloque
run_proc
:ActiveRecord::Base.logger = ActiveSupport::BufferedLogger.new('/path/to/log/file.log')
- Luego recibí un tercer error, y la solución fue requerir el entorno de Rails dentro del bloque
run_proc
en lugar de antes en el script.
Mi guión final es el siguiente:
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
¿Estás iniciando daemons con 'bundle exec my_script_ctl start'? – forker
Hmm, no, yo estaba haciendo 'RAILS_ENV = production ruby script/myscript_control.rb start'. Solo traté de hacerlo a su manera, y ahora me aparece un error diferente: /usr/lib/ruby/gems/1.8/gems/activesupport-3.1.0/lib/active_support/buffered_logger.rb:109:in 'write ': closed stream (IOError) – NudeCanalTroll
Así que seguí los consejos aquí (http://stackoverflow.com/questions/5809678/rails-3-daemons-gem-exception-when-querying-model) para deshacerme de la error de registro, y recibí un nuevo error que decía que algunas tablas no existían en mi base de datos de desarrollo. Pero estoy tratando de ejecutar esto en producción, así que agregué 'RAILS_ENV = production' delante de' bundle exec', y ahora volvemos al error original del "servidor MySQL se ha ido". :( – NudeCanalTroll