5

Unbuntu 서버에서 실행중인 Rails 3.1 앱의 데몬을 설정하려고합니다. 이 같은 간단한 뭔가 :Rails 3.1 + Daemons gem을 사용하면 데이터베이스에 액세스 할 수 없습니다.

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에 도착하면, 나는 다음과 같은 오류 얻을 : 내 스크립트는 MySQL로 연결할 수없는 이유

/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 

어떤 생각을? Daemons.run_proc 앞에 BlogPost.count 코드를 넣으면 MySQL에 잘 연결할 수 있습니다.

---------- EDIT : SOLVED! 내 데몬을 stoping/시작할 때

  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. 그런 다음 세 번째 오류가 발생했으며 해결 방법은 스크립트의 앞부분에있는 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 
+0

당신은'bundle exec my_script_ctl start'로 데몬을 시작하고 있습니까? – forker

+0

흠, 아니, 나는'RAILS_ENV = production ruby ​​script/myscript_control.rb start'을하고 있었다. 방금 ​​시도했는데 다른 오류가 발생했습니다. /usr/lib/ruby/gems/1.8/gems/activesupport-3.1.0/lib/active_support/buffered_logger.rb:109:in 'write ': 닫힌 스트림 (IOError) – NudeCanalTroll

+0

그래서 여기에있는 조언 (http://stackoverflow.com/questions/5809678/rails-3-daemons-gem-exception-when-querying-model)에 따라 로깅 오류가 발생했으며 일부 개발 테이블에 일부 테이블이 존재하지 않는다는 새로운 오류가 발생했습니다. 하지만 프로덕션 환경에서이를 실행하려고하므로'bundle exec '앞에'RAILS_ENV = production'을 추가했습니다. 이제 "MySQL 서버가 없어졌습니다"라는 원래 오류로 돌아 왔습니다. : – NudeCanalTroll

답변

1

제대로 스크립트에 대한 레일 환경 (의존성)을 미리로드 다음과 같이 시작하려면 :

bundle exec my_script_ctl start 
1

내가 왜 아무 생각이 없다, 스크립트를 대몬 화하기 전에 데이터베이스 연결을 끊을 때 작동합니다 :

# 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 

희망이 도움이됩니다.

관련 문제