Пользовательский демон с Rails 3 - PullRequest
14 голосов
/ 26 марта 2011

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

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

-Установлен гем демонов

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

-Генерация демона: rails генерирует слушателя демона

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

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

*** 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>

Есть мысли о том, как создать Демон, который загружает Rails 3.0.5?

Ответы [ 4 ]

16 голосов
/ 03 марта 2012

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

script / daemon

#!/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") 

daemons / 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

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

2 голосов
/ 12 июня 2011

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

в urserver_control.rb (в корневом каталоге приложения ruby):

    #!/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 }

1 голос
/ 29 апреля 2011

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

Глядя на мой скрипт демона delayed_job и config.ru, они загружают config / environment.rb (который, в свою очередь, загружает application.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)

0 голосов
/ 04 мая 2011

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

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

, либо

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

Работает.

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

...