Mysql Rails 3.1+;守护进程宝石赢了';I don’我不能访问我的数据库
我正在尝试为运行在Ubuntu服务器上的Rails 3.1应用程序设置一个守护进程。就这么简单:Mysql Rails 3.1+;守护进程宝石赢了';I don’我不能访问我的数据库,mysql,ruby-on-rails,ruby-on-rails-3,scripting,ruby-on-rails-3.1,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 require
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
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
但是当我进入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\u proc
之前,我就可以很好地连接到MySQL
----------编辑:解决了------------
对于任何对解决方案好奇的人来说,我必须做三件事才能让它起作用:
bundle exec
:RAILS\u ENV=production bundle exec myscript.rb start
run\u proc
块中添加以下代码:ActiveRecord::Base.logger=ActiveSupport::BufferedLogger.new('/path/to/log/file.log')
run\u proc
块中使用Rails环境,而不是在脚本的前面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
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
我不知道为什么,但当我在后台监控脚本之前断开数据库连接时,它会起作用,例如:
# 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
希望这能有所帮助。你是用
bundle exec my_script\u ctl start启动守护程序的吗?嗯,不是我在做RAILS\u ENV=production ruby script/myscript\u control.rb start
。我只是试着按照你的方式来做,现在我得到了一个不同的错误:/usr/lib/ruby/gems/1.8/gems/activesupport-3.1.0/lib/active\u support/buffered\u logger.rb:109:in‘write’:closed stream(IOError),所以我按照这里的建议()来消除日志错误,我得到了一个新的错误,说我的开发数据库中不存在一些表。但我正试图在生产环境中运行此功能,因此我在bundle exec
前面添加了RAILS\u ENV=production
,现在我们回到了“MySQL服务器已消失”的原始错误:(那么故事的另一部分是什么呢?将环境加载到块中而不是文件的顶部。我只是用完整的解决方案编辑了我的问题。