2008-09-01 42 views
5

Rubyスクリプトがすでに実行されているかどうかを簡単に確認してから適切に処理する方法はありますか?たとえば、私はreally_long_script.rbというスクリプトを持っています。私はそれを5分ごとに実行するように頼んだ。実行されると、前の実行がまだ実行されているかどうかを確認してから、2番目のスクリプトの実行を停止します。何か案は? bashでruby​​スクリプトが既に実行されているかどうかを確認

答えて

9

PSはそれと競合状態におそらくオープンを行うための本当に貧しいの方法があります。

従来のUnix/Linuxの方法では、PIDをファイル(通常は/ var/run)に書き込み、起動時にそのファイルが存在するかどうかを確認することです。

pidfileは/var/run/myscript.pidにあり、プログラムを実行する前にそのファイルが存在するかどうかを確認します。 O_EXCL(排他ロック)を使用してファイルとシンボリックリンクを開くことを含む競合状態を回避するためのいくつかのトリックがあります。

ただし、ファイルシステムでアトミック操作を使用することで競合状態を回避するようにコードを作成してください。ホイールを再発明し保存するには

は、スクリプト自体をクリーンアップせずに死亡した場合、それが実行されるようにあなたは、おそらくまた、プロセスが実際に実行されていることを確認する必要がありhttp://rubyforge.org/projects/pidify/

0

if ps aux | grep really_long_script.rb | grep -vq grep 
then 
    echo Script already running 
else 
    ruby really_long_script.rb 
fi 
0

で見たいと思うかもしれません次回は単に /var/run/foo.pidが存在することを確認して終了します。

0

Highlander

説明

あなたのメインスクリプトのインスタンスが1つだけ実行されている保証します宝石。要するに、1つしか存在できません。あらすじ一方、バック、コマンドライン上の

require 'highlander' # This should be the -first- thing in your code. 
# Your code here 

...

# First attempt, works. Assume it's running in the background. 
ruby your_script.rb 

# Second attempt while the first instance is still running, fails. 
ruby your_script.rb # => RuntimeError 

ノート

は、単にハイランダーの宝石は、股関節を保証必要

インストール

gem install highlander 

そのスクリプトの1つのインスタンス だけをもう一度起動することはできません。もう一度起動しようとすると、 はRuntimeErrorを発生させます。

関連する問題