ロックファイルを用いて排他制御を行う

#!/bin/sh
#lock.sh

LOCKDIR=/tmp/lock.sh.lockdir
COUNTFILE=/tmp/lock.sh.count

#共有ファイルを読み込み内容に1を加えて書き込む
count(){
    #引数がlockの場合ロックディレクトリを使い排他制御する
    if [ "$1" = "lock" ]; then
        until mkdir $LOCKDIR 2> /dev/null; do
            sleep 1
        done
    fi

    #共有ファイルを読み込み1を加えて保存
    cnt=`cat $COUNTFILE`
    cnt=`expr $cnt + 1`
    echo $cnt > $COUNTFILE
    echo $cnt

    if [ "$1" = "lock" ]; then
        rmdir $LOCKDIR
    fi
}

if [ -d $LOCKDIR ]; then
    echo "Lock directory $LOCKDIR exist."
    exit 1
fi

#count関数を10個同時にバックグランドで動作させ共有ファイルの中身が
#カウントアップされる様子を調べる
#ロックディレクトリを使って実行
echo "*** WITH LOCK FILE ***"
echo 0 > $COUNTFILE
for i in 1 2 3 4 5 6 7 8 9 10; do
    count lock &
done
wait

#ロックディレクトリを使わず実行
echo "*** WITHOUT LOCK FILE ***"
echo 0 > $COUNTFILE
for i in 1 2 3 4 5 6 7 8 9 10; do
    count &
done
wait

rm $COUNTFILE
$ ./lock.sh 
*** WITH LOCK FILE ***
1
2
3
4
5
6
7
8
9
10
*** WITHOUT LOCK FILE ***
1
1
1
1
1
1
1
1
1
1