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のようなものとして渡し、splitを介して解析し、Product.find(123)を実行して実際のレコードを取得できます。

もう1つのアプローチは、オブジェクト情報をmemcachedやredisなどのキューに入れ、デーモンにキューから情報をフェッチさせることです。これにより、デーモンの起動が少し簡単になり、デーモンが処理する複数のレコードをキューに入れることができます。(単一のレコードを処理するだけの何かは、とにかくスクリプトとして記述したほうがよいでしょう。)

私があなたのスクリプトについて持っている他の懸念は、ENV["APP_ROOT"]を使用することです。それは本当に環境に入る必要がありますか?2番目のデーモンがある場合はどうなりますか?ローカル変数としては良いようです。デーモンで必要な場合は、とにかくデーモンのファイルが配置されている場所を基準にしていつでも取得できます。

于 2012-07-03T15:22:37.103 に答える