3

我有一个要启动的守护程序,但我想在启动它时在守护程序中设置一些变量。这是我用来控制我的守护进程的脚本位于 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")

当我启动这个守护进程时,我想将一个变量传递给它,就像对活动记录的引用一样,这样我就可以将守护进程的初始运行作为它的基础。

4

1 回答 1

1

如果要获取特定的 ActiveRecord 对象,可以只传递 id 或类名 + id 作为命令行上的附加参数。由于您已经使用 ARGV[1] 作为脚本名称,因此您可以将其作为 ARGV[2] 和 Product_123 之类的内容传递,然后通过拆分进行解析,并执行 Product.find(123) 以获取实际记录。

另一种方法是将对象信息放入 memcached 或 redis 之类的队列中,并让守护程序从队列中获取信息。这将使您的守护程序启动更简单,并允许您将多个记录排队以供守护程序处理。(无论如何,只处理一条记录可能会更好地写成脚本。)

我对您的脚本的另一个担忧是使用 ENV["APP_ROOT"]。这真的需要进入环境吗?如果你有第二个守护进程怎么办?看起来它作为一个局部变量会更好,如果你在守护进程中需要它,你总是可以相对于守护进程的文件所在的位置来获取它。

于 2012-07-03T15:22:37.103 回答