GNU/Linux >> Linux の 問題 >  >> Linux

Ruby スクリプトのインスタンスが一度に 1 つだけ実行されるようにするにはどうすればよいですか?

これが古いことは承知していますが、興味のある方は、flock に渡して、ブロックする代わりに返すことができる非ブロック定数があります。

File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )

slhck の更新

flock これの場合は true を返します プロセスがロックを受け取りました。それ以外の場合は false。したがって、一度に 1 つのプロセスだけが実行されるようにするには、ロックを取得して、取得できなかった場合は終了する必要があります。 exit unless を入れるのと同じくらい簡単です 上記のコード行の前に:

exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )

これはあなたの質問に直接答えているわけではありませんが、私があなただったら、おそらくデーモン スクリプトを書くでしょう (http://daemons.rubyforge.org/ を使用できます)

たとえば、script/index という名前のラッパー スクリプトを介してインデクサー (indexer.rb を想定) を実行することができます。

require 'rubygems'
require 'daemons'

Daemons.run('indexer.rb')

スリープ間隔を指定することを除いて、インデクサーはほぼ同じことを行うことができます

loop do
   # code executing your indexing 

   sleep INDEXING_INTERVAL
end

これは、キュー サーバーと連携するジョブ プロセッサが通常どのように機能するかです。


一時ファイルを作成および削除し、このファイルの存在を確認できます。この質問への回答を確認してください:1 つのインスタンスのシェル スクリプト


必要に応じて、これは問題なく機能し、どこかに別のファイルを作成する必要はありません。

exit unless DATA.flock(File::LOCK_NB | File::LOCK_EX)

# your script here

__END__
DO NOT REMOVE: required for the DATA object above.

Linux
  1. 並行する4つのタスク…それを行う方法は?

  2. シェルスクリプトで一時ファイルを作成するにはどうすればよいですか?

  3. Bashスクリプトのインスタンスを1つだけ実行するようにするにはどうすればよいですか?

  1. 新しいカーネルがインストールされるたびにスクリプトを実行しますか?

  2. スクリプトはループを1回だけ実行しますか?

  3. Bash スクリプトのインスタンスが 1 つだけ実行されるようにする最善の方法は何ですか?

  1. VimでBashスクリプトを強調表示するには?

  2. 前回の実行時の値を保持する Bash スクリプトの変数

  3. ファイルがシェルスクリプトに存在する場合にのみ移動する