#!/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...