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