#!/bin/bash
 
## Copyright (C) 2009  Przemyslaw Pawelczyk <przemoc@gmail.com>
## License: GNU General Public License v2, v3
#
# Lockable script boilerplate
# https://gist.github.com/przemoc/571091
 
set -e
 
### 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 ###
 
echo $LOCKFILE
 
# Simplest example is avoiding running multiple instances of script.
exlock_now || (echo "Exiting..." && 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.
 
echo "Running"
(/bin/bash /tmp/test.sh &) && /bin/bash /tmp/test.sh 
/var/lock/test.sh
/var/lock/test.sh
Running
Exiting...
 
 
(./test.sh &) && ./test.sh 
/var/lock/test.sh
/var/lock/test.sh
Running
Exiting...