Ruby 1.9 Rails 3:使用变量启动守护进程

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")

当我启动此守护进程时,我想向其传递一个变量,比如一个活动记录的引用,以便我可以基于它来运行守护进程的初始过程。

我猜你的引用将来自另一个Ruby进程。如果是这样,也许你可以通过http://www.ruby-doc.org/stdlib-1.9.3/libdoc/drb/rdoc/DRb.html传递它(尽管我没有测试过)。 - hellvinz
1个回答

1

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

另一种方法是将对象信息放入队列中,例如memcached或redis,并让守护程序从队列中获取信息。这将使您的守护程序启动变得更简单,并允许您将多个记录排队等待守护程序处理。(只处理单个记录的操作可能最好编写为脚本。)

我对您的脚本的另一个担忧是使用ENV [“APP_ROOT”]。这真的需要放在环境中吗?如果您有第二个守护程序怎么办?最好将其作为局部变量,并且如果您需要在守护程序中使用它,您始终可以相对于守护程序文件所在的位置获取它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接