自定义守护进程与Rails 3
我正在尝试创建一个加载Rails环境的自定义守护程序。 我的环境如下:ruby-1.9.2-p180 rails 3.0.5
我做了以下事情:
– 安装守护进程gem
– 安装在这里的daemon_generator插件: https : //github.com/dougal/daemon_generator
-Generated守护进程:rails生成守护进程监听器
这一切都很好。 当我运行守护进程时,它可以工作。
但是,只要我尝试访问活动记录对象(例如尝试检索用户),它就会爆炸。
*** below you find the most recent exception thrown, this will be likely (but not certainly) the exception that made the application exit abnormally *** # *** 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 *** # # # # #
有关如何创建加载Rails 3.0.5的守护进程的任何想法?
我更喜欢滚动自己的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。
查看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)
尝试让daemon_generator工作时我遇到了很多问题。 我通过一起跳过daemon_generator并使用守护进程gem(v1.1.3)让我的守护进程工作。
在urserver_control.rb中(在root ruby app目录中):
#!/ usr / bin / env ruby 需要'rubygems' 要求'守护进程' 要求'TweetMsg' Daemons.run( 'urserver.rb')
在urserver.rb中:
#!/ usr / bin / env ruby require File.expand_path(File.join(File.dirname(__ FILE__),'config','environmen T')) 需要“rubygems” ---在这里插入你的代码---
您可以通过直接运行服务器测试ruby urserver.rb
或ruby urserver_controller run
然后一旦启动并停止控制器ruby urserver_control.rb {start | stop | run }
ruby urserver_control.rb {start | stop | run }
我在登台服务器上运行守护程序时遇到问题(Rails 3.0.7,ruby 1.8.7,passenger 3.0.0)。 也不
需要File.dirname( FILE )+“/../../ config / application”Rails.application.require_environment!
也不
require File.dirname( FILE )+“/../ config / environment”
工作。
我通过在rails根目录中重新安装标准config.ru来修复它(我已经卸载以集成w乘客……现在不确定如何让守护进程和乘客一起工作……)