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 © 2010-11 ICE House AB. See LICENSE for details.