2

daemonsgemを使用して無限ループ デーモンを開始および停止しようとしています。

ホームページを見て、(irbで)試しました:

require 'daemons'
=>true
task_handle = Daemons.call do
  loop{
    sleep 10
    puts "foo"
  }
end
=> #<Daemons::Application:0x000000043f96d0 ...
task_handle.stop
=> nil
task_handle2 = Daemons.call do
  loop{
    sleep 10
    puts "bar"
  }
end

=>Daemons::RuntimeException: there is already one or more instance(s) of the program running
from /home/bdares/.rvm/gems/ruby-1.9.3-p194/gems/daemons-1.1.9/lib/daemons/application_group.rb:125:in `new_application'
from /home/bdares/.rvm/gems/ruby-1.9.3-p194/gems/daemons-1.1.9/lib/daemons.rb:251:in `call'
from (irb):21

今、私が見ている正確な例(リンクされたページの#3)は、オプションを使用して最初の呼び出しを行います:multiple => trueが、一度に実行する必要があるデーモンは1つだけです(実際、複数のデーモンは望ましくありません)。

最初のデーモンはまだ何とか生きていて、GC されていませんか? もしそうなら、私は何が欠けていますか?

4

2 に答える 2

0

次のコードは正常に機能します。

require 'daemons'
task_handle = Daemons.call(:force => true)  do
  loop{
    sleep 10
    puts "foo"
  }
end

task_handle.stop

task_handle2 = Daemons.call do
  loop{
    sleep 10
    puts "foo"
  }
end

変更は、ファースト コール:forceオプションにあります。デーモンは、実行されていることだけでなく、作成されたアプリ番号をチェックします。あなたの場合、停止後でも最初のインスタンスはまだ存在します。「強制」オプションは、実行されていないアプリケーションを消去します。

別の問題が発生する可能性があることに注意してくださいtask_handle.stop。生成されたプロシージャがすぐに停止することを保証するものではないため、その状況に対処する必要があります。

于 2012-09-14T07:17:11.433 に答える
0

ここでの誤解は、デーモンが順番に実行されないということだと思います。それらの性質上、それらは並行して実行され、それらの間の調整はほとんどありません。System V IPC セマフォを調整するための Ruby インターフェイスを見つけることができると思いますが、ジョブ キューが必要な場合は、Daemons 以外のものを調べてください。

また、上記の@Sigurdの回答に追加するために、:forceオプションを実装する問題のコードを次に示します(これは便利に文書化されていません)(source):

115: if @applications.size > 0 and not @multiple
116:         if options[:force]
117:           @applications.delete_if {|a|
118:             unless a.running?
119:               a.zap
120:               true
121:             end
122:           }
123:         end
124:         
125:         raise RuntimeException.new('there is already one or more instance(s) of the program running') unless @applications.empty?
126:       end

したがって、基本的に ( zap、ソースで見つけたように、まったく何もしません) を指定すると、複数が設定されていない場合:force、デーモンは実行されていないすべてのアプリケーションを削除します。@applicationsそうしないと、エラーが発生します。つまり、:forceまたは:multipleを指定しないと、一方通行でエラーが発生するということです。

注: このすべての理由は、 (新しいジョブの作成を担当する)Application#stopからデーモンを削除しないためです。ApplicationGroup

注: ところで、Ruby{}で複数行のブロックに使用するのは悪い形式です。{}単一行ブロックにのみ使用します。do...end代わりに複数行に使用してください。

于 2012-09-15T02:13:04.600 に答える