2011-07-13 14 views
2

Rubyのデーモンとbluepill監視

誰かがこれを簡単またはあなたは私が間違っているのを教えてくださいすることができますを行う方法を私を見ることができますか?それが実行されますが、それを停止して起動しようとして続けると、その実行を知っていないように見えるように

現在bluepillは、デーモンを開始しています。ここで

は、ここに私の.pillファイルから自分のコード

app.process("get_dropboxes") do |process| 

    process.working_dir = RAILS_ROOT 
    process.pid_file = File.join(RAILS_ROOT, "tmp", "pids", "get_dropbox.pid") 
    process.start_command = "/usr/bin/env RAILS_ENV=#{RAILS_ENV} bundle exec lib/daemons/get_dropbox_ctl start" 
    process.stop_command = "/usr/bin/env RAILS_ENV=#{RAILS_ENV} bundle exec lib/daemons/get_dropbox_ctl stop" 

    process.start_grace_time = 10.seconds 
    process.stop_grace_time = 10.seconds 
    process.restart_grace_time = 10.seconds 

    process.checks :cpu_usage, :every => 30.seconds, :below => 20, :times => [3,5] 
    process.checks :mem_usage, :every => 30.seconds, :below => 350.megabytes, :times => [3,5] 

end 

である私のget_dropbox_ctlファイル

#!/usr/bin/env ruby 
require 'rubygems' 
require "daemons" 
require 'yaml' 
require 'erb' 

gem 'activesupport', '>=3.0.0' 
require 'active_support' 

# For some reason, ActiveSupport 3.0.0 doesn't load. 
# Load needed extension directly for now. 
require "active_support/core_ext/object" 
require "active_support/core_ext/hash" 

options = YAML.load(
    ERB.new(
    IO.read(
     File.dirname(__FILE__) + "/../../config/daemons.yml" 
)).result).with_indifferent_access 

options[:dir_mode] = options[:dir_mode].to_sym 

Daemons.run File.dirname(__FILE__) + "/get_dropbox.rb", options 

そして、ここで私が手に私のget_dropbox.rbファイルです

#!/usr/bin/env ruby 

# You might want to change this 
ENV["RAILS_ENV"] ||= "production" 

require 'net/pop' 
require File.dirname(__FILE__) + "/../../config/application" 
Rails.application.require_environment! 

$running = true 
Signal.trap("TERM") do 
    $running = false 
end 

while($running) do 


    # do stuff ....... 

    sleep 60 
end 

ログです

[2011-07-13T16:55:00.464202 #32257] WARN -- : [domain.com:get_dropboxes] pid_file /var/www/domain.com/current/tmp/pids/get_dropbox.pid does not exist or cannot be read 
W, [2011-07-13T16:55:00.464315 #32257] WARN -- : [domain.com:get_dropboxes] pid_file /var/www/domain.com/current/tmp/pids/get_dropbox.pid does not exist or cannot be read 
W, [2011-07-13T16:55:00.464505 #32257] WARN -- : [domain.com:get_dropboxes] Executing start command: /usr/bin/env RAILS_ENV=production bundle exec lib/daemons/get_dropbox_ctl start 
I, [2011-07-13T16:55:01.602210 #32257] INFO -- : [domain.com:get_dropboxes] Going from down => starting 

確かにこれより簡単な方法がありますか?

+0

あなたはcronジョブでこれをしない理由はありますか? – moritz

+0

私はそれを監視し、それがダウンし、私は他のものを監視するためにbluepillを使用しているので、それが最良の選択肢だと思ったら自動再起動する必要が???または私は間違っていますか? – rick

+0

これは、次のように考えています。60秒ごとにジョブを実行したい場合は、実際のジョブが長い時間(たとえば5秒)かかると「ドリフト」しないので、cronは良いオプションです。 60秒の睡眠は、実際のデーモン化されたプロセスよりもこれがあなたのシナリオに近いことを示唆していますか? – moritz

答えて

0

私は、これはあなたが探しているものであるかどうかわからないけど、私の知る限り、あなたは、デーモンファイルをスキップして、そのためにbluepill使用することができます。あなたがpidfileを指定する限り、process.daemonize = trueを設定することができ、デーモンが作成されます。

+0

ありがとうございます。それでは、rails環境でrubyスクリプトを起動するためのprocess.start_commandコマンドは何ですか?またはこれはちょうどレーキの仕事ですか? – rick

+0

rakeタスクを使うだけでうまくいくはずです。停止タスクを指定しない場合は、プロセス信号を使用してプロセスを終了します(通常は動作します)。 – namxam

+0

ええ、フォアグラウンドで実行されているプロセスの場合は、 'process.daemonize'を指定するとうまく行きます。プロセスが自己デーモン化する場合、プロセスはそれ自身のPIDファイルを生成しなければならず、 'grace_start_time'が経過した後でpidファイルがどこにあるのかをbluepillに伝えなければなりません。 – d11wtq