Пользовательский демон с Rails 3

Я пытаюсь создать собственный демон, который загружает среду Rails. Моя среда выглядит следующим образом: рубиново-1.9.2-p180 рельсы 3.0.5

Я сделал следующее:

-Установил камень демонов

-Установленный плагин daemon_generator, найденный здесь: https://github.com/dougal/daemon_generator

-генерированный демона: рельсы генерируют приемник демона

Все это отлично работало. Когда я запускаю демон, он работает.

Однако, как только я пытаюсь получить доступ к активному объекту записи, например, пытаясь получить пользователя, он взрывается.

*** below you find the most recent exception thrown, this will be likely (but not certainly) the exception that made the application exit abnormally ***
#<NameError: method `recognize' not defined in Rack::Mount::RouteSet>
*** below you find all exception objects found in memory, some of them may have been thrown in your application, others may just be in memory because they are standard exceptions ***
#<NoMemoryError: failed to allocate memory>
#<SystemStackError: stack level too deep>
#<fatal: exception reentered>
#<NoMethodError: undefined method `eq' for nil:NilClass>
#<NameError: method `recognize' not defined in Rack::Mount::RouteSet>

Любые мысли о том, как создать Daemon, который загружает Rails 3.0.5?

Ответ 1

Я предпочитаю рулить свои собственные контроллеры демонов. Вот простой пример, который работает в большинстве случаев:

script/демон

#!/usr/bin/env ruby
require 'rubygems'
require 'daemons'

ENV["APP_ROOT"] ||= File.expand_path("#{File.dirname(__FILE__)}/..")
ENV["RAILS_ENV_PATH"] ||= "#{ENV["APP_ROOT"]}/config/environment.rb"

script = "#{ENV["APP_ROOT"]}/daemons/#{ARGV[1]}"

Daemons.run(script, dir_mode: :normal, dir: "#{ENV["APP_ROOT"]}/tmp/pids") 

Демоны/your_daemon_script.rb

require ENV["RAILS_ENV_PATH"]
loop { 
  ... your code ...
}

Вы можете управлять своими деамонами, используя следующие команды:

script/daemon run your_daemon_script.rb
script/daemon start your_daemon_script.rb
script/daemon stop your_daemon_script.rb

Это позволяет мне легко добавлять новые демоны, и я могу легко загрузить рельсы в каждом script, если это необходимо.

Ответ 2

Глядя на код в https://github.com/dougal/daemon_generator/blob/master/lib/generators/daemon/templates/script.rb, похоже, что они загружают вещи в неправильном порядке...

Глядя на моего daemon delayed_job script и config.ru, они загружают config/environment.rb(который, в свою очередь, загружает application.rb и инициализирует приложение)

Таким образом, возможное исправление будет состоять в том, чтобы отредактировать созданный script и заставить его требовать только "config/environment.rb"

Я пробовал это:

 #!/usr/bin/env ruby

 # You might want to change this
 ENV["RAILS_ENV"] ||= "development"

 require File.dirname(__FILE__) + "/../config/environment"

 $running = true
 Signal.trap("TERM") do
   $running = false
 end

 while($running) do

   # Replace this with your code
   Rails.logger.auto_flushing = true
   o = Order.last
   Rails.logger.info "The latest order is #{o.id}"

   sleep 10
 end

и он не дал ошибок... (Пробовал оба Rails 3.0.3 и 3.0.5)

Ответ 3

У меня было много проблем с попыткой работать daemon_generator. Я получил своего демона, пропустив daemon_generator все вместе и просто используя камень демонов (v1.1.3).

в urserver_control.rb(в корневом каталоге ruby ​​app):

    #!/usr/bin/env ruby
    require 'rubygems'
    require 'daemons'
    require 'TweetMsg'

    Daemons.run('urserver.rb')

в urserver.rb:

#!/usr/bin/env ruby
require File.expand_path(File.join(File.dirname(__FILE__), 'config', 'environmen
t'))
require "rubygems"

  --- insert your code here ---

Вы можете протестировать, запустив свой сервер напрямую ruby urserver.rb или ruby urserver_controller run А затем, когда это работает, запуск и остановка контроллера ruby urserver_control.rb {start | stop | run }

Ответ 4

У меня были проблемы с запуском daemon, как на моем промежуточном сервере (Rails 3.0.7, ruby ​​1.8.7, пассажир 3.0.0). Ни

требуется File.dirname(FILE) + "/../../config/application" Rails.application.require_environment!

ни

требуется File.dirname(FILE) + "/../config/environment"

Работали.

Я исправил его, переустановив стандартный config.ru в rails root (который я деинсталлировал для интеграции w пассажира... не уверен теперь, как я получу демонов и пассажира, чтобы теперь работать вместе...)