SingleInstance¶ ↑
SingleInstance creates a system-wide lock that prevents multiple copies of the same code to run at the same time. We use it to make sure that ‘cron` jobs do not start if an earlier invocation is still running.
# in Rakefile task :build_models do |t, args| SingleInstance.exclusive_non_blocking(:build_models) do # ... end end
Optionally, the block can be allowed to react to the fact that another process is running:
SingleInstance.exclusive_non_blocking(:build_models) do |blocker| if blocker puts "Cannot run; pid #{blocker.pid} is running since #{blocker.started_at}" else # ... end end
Run without a block, it creates a lock that lasts as long as the process is running:
# in Rakefile task :all => [:exclusive, :this, :that, :whatever] task :exclusive do SingleInstance.exclusive_non_blocking(:build_models) || exit end
There is also a simple binary (called ‘single_instance`) that you can use to wrap non-Ruby tasks:
# in crontab */10 * * * * single_instance /usr/local/bin/long-running-task
Note on Patches/Pull Requests¶ ↑
-
Fork the project.
-
Make your feature addition or bug fix.
-
Add tests for it. This is important so I don’t break it in a future version unintentionally.
-
Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but
bump version in a commit by itself I can ignore when I pull)
-
Send me a pull request. Bonus points for topic branches.
Copyright¶ ↑
Copyright © 2010-11 ICE House AB. See LICENSE for details.