我有一个我正在尝试启动的守护进程,但我想在启动它时在守护进程中设置一些变量。这是我用来控制位于 RAILSAPP/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")
当我启动这个守护进程时,我想将一个变量传递给它,就像对事件记录的引用一样,这样我就可以将守护进程的初始运行作为基础。
最佳答案
如果你想获取一个特定的 ActiveRecord 对象,你可以只传递 id,或者类名 + id 作为命令行上的附加参数。由于您已经使用 ARGV[1] 作为脚本名称,您可以将其作为 ARGV[2] 和类似 Product_123 的内容传递,然后通过拆分进行解析,并执行 Product.find(123) 以获取实际记录。
另一种方法是将对象信息放入 memcached 或 redis 之类的队列中,然后让守护进程从队列中取出信息。这将使您的守护程序启动更简单一些,并允许您排队多个记录以供守护程序处理。 (无论如何,只处理单个记录的东西可能最好写成脚本。)
我对您的脚本的另一个担忧是使用 ENV["APP_ROOT"]。那真的需要进入环境吗?如果你有第二个守护进程怎么办?看起来它作为一个局部变量会更好,如果你在守护进程中需要它,你总是可以相对于守护进程的文件所在的位置获取它。
关于Ruby 1.9 Rails 3 启动带变量的守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11018086/