#!/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 [[ $2 = "reset" ]]; then if [[ ! "$3" -gt "0" ]]; then echo "Parameter 3: Needs to be a number"; exit;fi rm -f $1 [[ -d "$1_lockdir" ]] && rmdir $1_lockdir echo $3 > $1 exit 0 fi if [[ ! -f $1 ]]; then echo "Parameter 1: File Does not exist"; exit; fi if [[ $2 != "lock" ]] && [[ $2 != "release" ]] && [[ $2 != "reset" ]]; then echo "Parameter 2: must be lock, release or reset"; 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" else sleep 1; wait fi else sleep 0.5; fi done rmdir $1_lockdir else 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 done rmdir $1_lockdir 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