Just a little lockfile library for bash.
If the lockfile script is in the same folder as your script.. source $(dirname $0)/lockfile.sh
Then call.
setup_lockfile
check_lock
create_lock
Do your scripty stuff then call
cleanup_lock
#!/bin/bash
# Lockfile utilities
setup_lockfile(){
# set name of this program's lockfile:
MY_NAME=`basename $0`
LOCKFILE=/tmp/lock.${MY_NAME}
# MAX_AGE is how long to wait until we assume a lock file is defunct
# scary stuff, with loads of scope for improvement...
# could use fuser and see if there is a process attached/not?
# maybe check with lsof? or just bail out?
MAX_AGE=120
echo "My lockfile name is ${LOCKFILE}"
# Wait a random time up to half an hour before starting
echo "Random wait"
sleep $[ ( $RANDOM % 1800 ) + 1 ]s
}
check_lock(){
# Check for an existing lock file
while [ -f /tmp/lock.${MY_NAME}* ]
do
# A lock file is present
if [[ `find /tmp/lock.* -mmin +${MAX_AGE}` > "0" ]]; then
echo "WARNING: found and removing old lock file...`ls /tmp/lock.${MY_NAME}*`"
rm -f /tmp/lock.${MY_NAME}*
else
echo "A recent lock file already exists : `ls /tmp/lock.${MY_NAME}* | awk -F. {'print $2"."$3", with PID: " $4'}`"
echo "Will wait until the lock file is over ${MAX_AGE} minutes old then remove it..."
fi
sleep $(( 60 + (( RANDOM % 10 ))))
done
}
create_lock(){
# ok to carry on... create a lock file - quickly ;-)
touch ${LOCKFILE}
# check we managed to make it ok...
if [ ! -f ${LOCKFILE} ]; then
echo "Unable to create lockfile ${LOCKFILE}!"
exit 1
fi
echo "Created lockfile ${LOCKFILE}"
}
cleanup_lock(){
echo "Cleaning up... "
rm -f ${LOCKFILE}
if [ -f ${LOCKFILE} ]; then
echo "Unable to delete lockfile ${LOCKFILE}!"
exit 1
fi
echo "Ok, lock file ${LOCKFILE} removed."
}