Create a gist now

Instantly share code, notes, and snippets.

Lockable script
## Copyright (C) 2009 Przemyslaw Pawelczyk <>
## License: GNU General Public License v2, v3
# Lockable script boilerplate
### HEADER ###
LOCKFILE="/var/lock/`basename $0`"
_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; }
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
# 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.
blezek commented Sep 24, 2012

Outstandingly useful script. Thanks!


ditto @dblezek


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 commented Dec 19, 2013


  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 commented Aug 15, 2015

Super helpful, thanks for this boilerplate. 🍹


@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 commented Dec 13, 2015

There won't be a problem. I'll improve this boilerplate a bit by incorporating some of my comments you can find in 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