Skip to content

Instantly share code, notes, and snippets.

@windix
Forked from przemoc/lockable_script_boilerplate.sh
Last active September 9, 2016 03:01
Show Gist options
  • Save windix/5eb7ef790139d1601016859b968ac205 to your computer and use it in GitHub Desktop.
Save windix/5eb7ef790139d1601016859b968ac205 to your computer and use it in GitHub Desktop.
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`"
LOCK_TIMEOUT=1 # minute
LOCKFD=99
# PRIVATE
_clear_stale_lock() { if [ "`find $LOCKFILE -mmin +${LOCK_TIMEOUT} 2>/dev/null`" ] ; then rm -f $LOCKFILE; fi; }
_lock() { flock -$1 $LOCKFD; }
_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; }
_prepare_locking() { _clear_stale_lock; eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }
_exit() { echo "Cannot get lock $LOCKFILE, quit..."; exit 1; }
# 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
# 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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment