Mysql Rails 3.1+;守护进程宝石赢了';I don’我不能访问我的数据库

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

我正在尝试为运行在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 '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
  • 此时,我停止获取MySQL2错误,但开始获取记录器错误。解决方案是在
    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服务器已消失”的原始错误:(那么故事的另一部分是什么呢?将环境加载到块中而不是文件的顶部。我只是用完整的解决方案编辑了我的问题。