2012-03-12 14 views
10

は、何がいずれかの私のRubyスクリプトを再度実行し、または前のインスタンスが終了するのを待つことができないようにする簡単な方法かもしれない?**私は散らかっファイルロックを避けるために望んでいる同じRubyスクリプトの同時インスタンスを制限する方法はありますか? Rubyの1.9.xで

またはプロセステーブルチェック。

コアにすでにglobal mutexまたはセマフォのようなものがありますか? 私はネイティブMutexを研究しましたが、これは1つのRubyプロセス内のスレッドにのみ適用され、異なるプロセス間では適用されないようです。

**後で、タイムアウト機能を追加したり、N個のインスタンスに制限したり、複数のグローバルロック(システム全体のリソースごとに最大1つのインスタンスのみを持つ)を使用するように見えます。

答えて

2

これは通常、フラグファイルをチェックし、スクリプト自体ではなく、起動を再試行しないことで、OSレベルで解決されます。

ただし、スクリプトをチェックインする場合は、既知の場所にあるセマフォファイルを探します。それが存在し、起動ウィンドウに収まる時間ウィンドウ内にない場合は、ファイルを削除して新しいウィンドウを作成します。それがあなたの時間窓の中にあれば、終了してください。

ファイルロックを使用したり、タイムスタンプをファイルに保存したり、cronタイプのメカニズムを使用して起動しないと、他の多くのチェックが可能です。それぞれのアプローチにはプラスとマイナスがあります。

Control-Cを終了すると、そのファイルも消去されるように、割り込みをトラップしたいと思うでしょう。

右の関連する質問を読んでください。彼らは他のさまざまな言語をカバーしていますが、提案された回答は、問題を理解し、すべての言語でそれらを回避する可能性のある方法を理解するのに役立ちます。

+0

私はすでにRubyの大部分を、 '[-z" $(pidof -x -o%PPID -o $$ $ {0 ## * /})のようなコード "] || exec echo "$(date)$ 0:$$は既にPID:$(pidof -x $ 0)、... bye !!"の臭いがありますが、他の目的にも役立ちます。すでにRuby自体に含まれているさらに優れた解決策は、固定ファイルをロックするなどです。 '/ tmp/scriptname.rb.lock'。終了時に、またはコードがクラッシュしても(例外を発生させることが多い)、システムはそのロックをクリアします。とにかく必要があるグローバルセマフォーにきれいでネイティブなインターフェイスがあるまで、私はちょうどそのハックに行きます。 – Marcos

5

この非常に短いコードは、スクリプトが排他的にロックされた後に命名/ tmpにロックファイルまでの場所でフリーズします:

File.open("/tmp/#{File.basename $0}.lock", File::RDWR|File::CREAT, 0644).flock(File::LOCK_EX) 

それをロックする他のプログラムを、Rubyやないが、終了させるか、殺されるのみ必要新しいプロセスインスタンスがブロックを解除して処理を続行するようにします。今のところ、この回避策は私が必要とするものです。私はせっかち取得する場合、私は、例えば、ラップbashのスクリプトから

timeout 1m ./myrubyscript.rb 

と私のRubyのプログラムを呼び出すことができます。 (その例では、myrubyscript.rbは、1分後に終了してファイルのロックを解除してファイルのロックを解除して、何が行われたかを継続します)

関連する問題