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.