#!/usr/bin/env bash # A generic counting semaphore in bash # Parameter is the lockfile and operation # Setup: # rm /tmp/test # echo $num > /tmp/test set -e if [[ ! -f $1 ]]; then echo "Parameter 1: File Does not exist"; exit; fi if [[ $2 != "lock" ]] && [[ $2 != "release" ]]; then echo "Parameter 2: must be lock or release"; exit; fi if [[ $2 = "lock" ]]; then SEM='' while [[ -z $SEM ]]; do if (( $(cat $1 ) == 0 )); then sleep 1; wait; continue; fi if mkdir $1_lockdir > /dev/null 2>&1 ; then VAL=$(cat $1) if (( $VAL > 0 )) then SEM=$(sed -i "s@$VAL@$(( $VAL - 1))@w /dev/stdout" $1) echo "Take $VAL -> $SEM" rmdir $1_lockdir else rmdir $1_lockdir sleep 1; wait fi else sleep 0.5; fi done else echo "Attempt unlock" SEM='' while [[ -z $SEM ]]; do if mkdir $1_lockdir > /dev/null 2>&1 ; then VAL=$(cat $1) SEM=$(sed -i "s@$VAL@$(( $VAL + 1))@w /dev/stdout" $1) echo "Give $VAL -> $(( $VAL + 1 ))" else sleep 0.1; fi rmdir $1_lockdir done fi #SEM=''; while [[ -z SEM ]]; do VAL=$(cat /tmp/test); if (( $VAL > 0 )); then SEM=$(sed -i "s@$VAL@$(( $VAL - 1))@w /dev/stdout" /tmp/test); else sleep 1; wait; fi; done