3

複数のデーモンで同じスクリプトを実行しようとしています。

myapp.rbこのように見えます:

loop do
  sleep 5
  1 / 0 # crash it
end

私のmyapp_controller.rb

require 'rubygems'
require 'daemons'

options = {
  :log_output  => true,
  :backtrace   => true,
  :monitor     => true,
  :multiple    => true,
  :log_dir     => '/mnt/log/',
  :hard_exit   => true
}
Daemons.run(File.join(File.dirname(__FILE__), 'myapp.rb'), options)

ruby myapp_controller.rb start連続して数回実行すると、予想どおり、その数のデーモンが作成されます。しかし、しばらくするとmyapp.rb、デーモンのエラーが原因でクラッシュし、モニターがすべてではなく1つだけ再起動します。そのため、デーモンが1つ実行されることになります。

なんで?私は何が間違っているのですか?

4

2 に答える 2

4

動作を再現することができました。それはあなたが間違っていることではありません。それがdaemons gem振る舞い方です。

デーモンgemのコードを調べてみると、この:multipleオプションはオプションではうまく機能しないことがわかりました:monitor

この:monitorオプションは、デーモンがシングルモードで実行されている場合にのみ機能します。

この質問をソースとして参照して、デーモンプロジェクトページにバグレポートを作成しました。

問題の再現に関する詳細情報:

の場合、複数のデーモンプロセスが作成され:multiple => trueます。各プロセスには、の形式の独自のpidファイルがあります<scriptname>.rb<number>.pid

ただし、(単一の<scriptname>.rb_monitor.pidファイルで)作成されるモニター・プロセスは1つだけです。

デーモンプロセスを3回開始したときに開始されるプロセスのリストは次のとおりです。

$ ps -fe | grep my_server
  501  1758     1   0 12:25PM ??         0:00.63 my_server.rb  
  501  1759     1   0 12:25PM ??         0:00.43 my_server.rb_monitor  
  501  1764     1   0 12:25PM ??         0:00.54 my_server.rb  
  501  1834     1   0 12:51PM ??         0:00.31 my_server.rb 

pid / logフォルダー内のファイル:

$ ls /tmp/daemons-2013-01-25/
my_server.rb.log                my_server.rb1.pid               my_server.rb_monitor.pid
my_server.rb0.pid               my_server.rb2.pid
于 2013-01-25T09:22:45.480 に答える
0

問題が解決するまで、コードを次のように変更できます。

#myapp_controller.rb
require 'rubygems'
require 'daemons'

number = ARGV.fetch(1)

options = {
  :app_name    => "daemon-#{number}" # provide app_name
  :log_output  => true,
  :backtrace   => true,
  :monitor     => true,
  :multiple    => false, # disable multiple option
  :log_dir     => '/mnt/log/',
  :hard_exit   => true
}
Daemons.run(File.join(File.dirname(__FILE__), 'myapp.rb'), options)

次に、次のコマンドを使用してデーモンを起動します。

ruby myapp_controller.rb start 1
ruby myapp_controller.rb start 2
...

これにより、スタートアップコードがわずかに変更されますが、デーモンプロセスごとに監視プロセスが作成されます。

于 2018-11-11T17:18:05.677 に答える