5

मैं अपने रेल 3.1 ऐप के लिए एक डिमन सेट करने की कोशिश कर रहा हूं जो एक अनबंटू सर्वर पर चल रहा है। बस इस तरह सरल कुछ:रेल 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 

लेकिन जब मैं 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 से कनेक्ट नहीं कर सकता है? अगर मैं Daemons.run_proc से पहले BlogPost.count कोड डालता हूं, तो मैं बस MySQL से कनेक्ट कर सकता हूं।

---------- संपादित करें: हल हो गया!

  1. bundle exec शामिल करें शुरू करने/मेरी डेमॉन stoping: ------------

    किसी समाधान जानने के लिए उत्सुक के लिए, मैं यह काम करने के लिए प्राप्त करने के लिए तीन बातें करना पड़ा : 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

क्या आप 'बंडल exec my_script_ctl start' के साथ डिमन्स शुरू कर रहे हैं? – forker

+0

हम्म, नहीं, मैं 'RAILS_ENV = उत्पादन रूबी स्क्रिप्ट/myscript_control.rb प्रारंभ कर रहा था। मैंने अभी इसे अपना रास्ता करने का प्रयास किया है, और अब मुझे एक अलग त्रुटि मिल रही है: /usr/lib/ruby/gems/1.8/gems/activesupport-3.1.0/lib/active_support/buffered_logger.rb:109:in 'लिखें': बंद स्ट्रीम (IOError) – NudeCanalTroll

+0

इसलिए मैंने यहां सलाह का पालन किया (http://stackoverflow.com/questions/5809678/rails-3-daemons-gem-exception-when-querying-model) से छुटकारा पाने के लिए लॉगिंग त्रुटि, और मुझे एक नई त्रुटि मिली है जिसमें कहा गया है कि मेरे विकास डेटाबेस में कुछ टेबल मौजूद नहीं हैं। लेकिन मैं इसे उत्पादन पर चलाने की कोशिश कर रहा हूं, इसलिए मैंने 'बंडल निष्पादन' के सामने 'RAILS_ENV = उत्पादन' जोड़ा, और अब हम "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 

उम्मीद है कि यह मदद करता है।