2016-12-18 14 views
1

私はcronjobに入れたrubyスクリプトを書いています。同じスクリプトを実行しているプロセスがあれば、同じスクリプトを実行しないようにする必要があります。基本的に私は、同じスクリプトの重複したプロセスを実行しないようにしようとしています。スクリプトが実際に実行されていない場合は、実行するだけです。ruby​​が実行中のスクリプトを複数回実行するのを防ぐ

私はフロックを試しましたが、書き込み専用のファイルをロックしていると思います。プロセスのいずれかが既にファイルを書き込んでいるように、他のプロセスは同じファイルを書き込むことができません。

どういうわけか私は実行中のプロセスをチェックして管理しています。しかし、Rubyには、このことを処理できる組み込みモジュールがありますか?

答えて

3

このPIDファイルgemはお役に立ちます。

require 'pidfile' 

pf = PidFile.new 
puts "LAUNCHING SCRIPT" 
loop do 
    sleep 1 
    puts "+1" 
end 

それは一度正常に動作の起動:

は、ここでの例です。二回、それを起動しようとすると

が返されます。

pidfile.rb:39:in `initialize': Process (lock.rb - 17724) is already running. (PidFile::DuplicateProcessError) 
    from lock.rb:3:in `new' 
    from lock.rb:3:in `<main>' 

注:PIDファイルは、デフォルトでは/tmpで書かれています。再起動時に/tmpが消去されるため、Ubuntuでは問題ありません。

/tmpが毎日清掃される他のシステム(RHELなど)では問題が発生する可能性があります。

2

ありがとう@Eric。しかし、私は追加の宝石をインストールすることなく、この作業を行うことができました。

if $0 == __FILE__ 
    if File.new(__FILE__).flock(File::LOCK_EX | File::LOCK_NB) 
    validation() 
    else 
    raise "Another process running for the same script." 
    end 
end 

__END__ 
+0

お役立ち情報また、プロセスが終了したときや再起動後に正常に動作するようです。 –

+0

プロセスを強制終了したり、サーバーを再起動しても動作します。 – Karthi1234

関連する問題