Skip to content
Create a gist now

Instantly share code, notes, and snippets.

Lockable script
#!/bin/bash
## Copyright (C) 2009 Przemyslaw Pawelczyk <przemoc@gmail.com>
## License: GNU General Public License v2, v3
#
# Lockable script boilerplate
### HEADER ###
LOCKFILE="/var/lock/`basename $0`"
LOCKFD=99
# PRIVATE
_lock() { flock -$1 $LOCKFD; }
_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; }
_prepare_locking() { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }
# ON START
_prepare_locking
# PUBLIC
exlock_now() { _lock xn; } # obtain an exclusive lock immediately or fail
exlock() { _lock x; } # obtain an exclusive lock
shlock() { _lock s; } # obtain a shared lock
unlock() { _lock u; } # drop a lock
### BEGIN OF SCRIPT ###
# Simplest example is avoiding running multiple instances of script.
exlock_now || exit 1
# Remember! Lock file is removed when one of the scripts exits and it is
# the only script holding the lock or lock is not acquired at all.
@dblezek
dblezek commented Sep 24, 2012

Outstandingly useful script. Thanks!

@bendilley

ditto @dblezek

@luislobo

I don't know much about bash scripting, i have simple questions:
1) my script should go at the end, after exlock_now || exit 1?
2) do I have to call _no_more_locking explicitly at the end?

@przemoc
Owner
przemoc commented Dec 19, 2013

@luislobo:

  1. Yes.
  2. No, _no_more_locking is called automatically when script ends.

Sorry for late reply, but unfortunately gists lack any notification system...

@xHN35RQ
xHN35RQ commented Aug 15, 2015

Super helpful, thanks for this boilerplate. :tropical_drink:

@PiotrCzapla

@Przemoc really useful snippet! But have you thought about getting it on the MIT license?

The GPL v2 prevents me form using it, as I would basically have to publish the script somewhere and that would be quite useless given that the script will have probably 2 more lines :)

Let me know what you think.

@przemoc
Owner
przemoc commented Dec 13, 2015

@PiotrCzapla
There won't be a problem. I'll improve this boilerplate a bit by incorporating some of my comments you can find in http://stackoverflow.com/a/1985512/241521 and relicense it to MIT License (which I'm already using in my more recent creations). For the time being please use simply relicensed version I've sent to your github e-mail.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.