Created
January 4, 2019 01:17
-
-
Save stanchan/27e06b5ae7fccbe4ba1dd59768597c4d to your computer and use it in GitHub Desktop.
Lock File Management Script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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