Skip to content

Instantly share code, notes, and snippets.

@stanchan
Created January 4, 2019 01:17
Show Gist options
  • Save stanchan/27e06b5ae7fccbe4ba1dd59768597c4d to your computer and use it in GitHub Desktop.
Save stanchan/27e06b5ae7fccbe4ba1dd59768597c4d to your computer and use it in GitHub Desktop.
Lock File Management Script
#!/bin/bash
[[ -z $1 ]] && echo "Usage: \"$0\" [sleep interval in seconds]" && exit 99
LOCKFILE=/tmp/.${0##*/}.exclusivelock
SLEEP_INTERVAL=$1
WAIT=30
declare -A LOCK_FDS=()
lock() {
local OP=$1
local FILE=$(readlink -f "$2")
case ${OP} in
quick)
[[ -f ${FILE} ]] && return 1
local LOCKFD
exec {LOCKFD}>"${FILE}"
flock -xn "${LOCKFD}" -c 'echo "Lock Acquired"'
trap "cleanup_lock ${FILE}" exit
LOCK_FDS[${FILE}]=${LOCKFD}
;;
shared)
[[ -f ${FILE} ]] && return 1
local LOCKFD
exec {LOCKFD}>${FILE}
flock -s "${LOCKFD}" -c 'echo "Shared Lock Acquired"'
trap "cleanup_lock ${FILE}" exit
LOCK_FDS[${FILE}]=${LOCKFD}
;;
hold)
[[ -f ${FILE} ]] && return 1
local LOCKFD
exec {LOCKFD}>${FILE}
flock -x "${LOCKFD}" -c 'echo "Lock Acquired"'
trap "cleanup_lock ${FILE}" exit
LOCK_FDS[${FILE}]=${LOCKFD}
;;
wait)
[[ -f ${FILE} ]] && return 1
local LOCKFD
exec {LOCKFD}>${FILE}
flock -w ${WAIT} "${LOCKFD}" -c 'echo "Lock Acquired"'
trap "cleanup_lock ${FILE}" exit
LOCK_FDS[${FILE}]=${LOCKFD}
;;
esac
}
cleanup_lock() {
local FILE=$(readlink -f "$1")
flock -u ${LOCK_FDS[${FILE}]}
flock -xn ${LOCK_FDS[${FILE}]}
rm -f ${FILE}
}
unlock() {
local FILE=$(readlink -f "$1")
[[ -f ${FILE} ]] || return
exec ${LOCK_FDS[${FILE}]}>&-
unset ${LOCK_FDS[${FILE}]}
}
lock quick ${LOCKFILE} || exit $?
while true; do
sleep $((${SLEEP_INTERVAL} - $(date +%s) % ${SLEEP_INTERVAL}))
echo "Running: $(date +%s)"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment