Bash Lockfile Script

Written by stovesy

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."
}

Leave a Reply