Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Ruby Gem that makes sure that only a single instance of a code block is running.
Ruby
tag: v0.3.0

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
bin
lib
test
.document
.gitignore
.rvmrc
Gemfile
Gemfile.lock
LICENSE
README.rdoc
Rakefile
single_instance.gemspec

README.rdoc

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.

Something went wrong with that request. Please try again.