自定义守护程序与Rails 3

时间:2011-03-26 08:36:52

标签: ruby-on-rails ruby ruby-on-rails-3 daemon

我正在尝试创建一个加载Rails环境的自定义守护程序。 我的环境如下: 红宝石1.9.2-P180 rails 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 个答案:

答案 0 :(得分:16)

我更喜欢滚动自己的rails守护程序控制器。这是一个适用于大多数情况的简单示例:

脚本/守护

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

这使我能够轻松添加新守护进程,如果需要,我可以轻松地在每个脚本中加载rails。

答案 1 :(得分:2)

尝试让daemon_generator正常工作时遇到了很多问题。我通过一起跳过daemon_generator并使用守护进程gem(v1.1.3)让我的守护进程工作。

在urserver_control.rb中(在root 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.rbruby urserver_controller run进行测试 然后,一旦启动并停止控制器ruby urserver_control.rb {start | stop | run }

答案 2 :(得分:1)

查看https://github.com/dougal/daemon_generator/blob/master/lib/generators/daemon/templates/script.rb中的代码,看来它们按错误的顺序加载...

查看我的delayed_job守护程序脚本和config.ru,他们加载config / environment.rb(然后加载application.rb并初始化应用程序)

所以可能的修复方法是编辑生成的脚本并使其只需要'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 :(得分:0)

我在登台服务器上运行守护程序时出现问题(Rails 3.0.7,ruby 1.8.7,passenger 3.0.0)。

需要File.dirname( FILE )+“/../../ config / application” Rails.application.require_environment!

,也不

需要File.dirname(文件)+“/../ config / environment”

的工作。

我通过在rails根目录中重新安装标准config.ru来修复它(我已经卸载以集成w乘客......现在不确定如何让守护进程和乘客一起工作...... )