【Shellscript】排他制御の方法【Linux】

shellscriptファイルを多重起動せず、アトミックに実行するにはちょっとしたコツが要るんだなって話。

大前提として、

  • まず一番に案が出るであろう、ロックファイルの作成での排他制御は無理。
  • シンボリックリンクの作成でアトミックに実行できるようになる。(flock、ハードリンクやフォルダ作成など、他にも方法はあるがこれが丁度良いか)

先に言っておくと以下の2記事以上のページは無いかと。

https://heartbeats.jp/hbblog/2013/10/atomic03.html

https://qiita.com/bsdhack/items/2492e9bdad0d3e17b7bb

上記記事を踏まえた上で、私の環境では以下が望ましい。

  • シンボリックリンク作成失敗時、exitせずにループ確認したい
  • ファイル途中からアトミックにしたいので、trap等によるシンボリックリンク削除は使用しない
  • PID確認までは大げさか(ちょっと他の懸案点が出ないかが心配)
  • 複数実行された場合、処理の順番は気にしない

という事で、カスタマイズを行った。

#!/bin/bash
LOCK_FILE=/tmp/lock

# 以下前処理
:
:
:

# 排他処理開始
count=0
while true ; do
  if ln -s $$ $LOCK_FILE >/dev/null 2>&1; then
    break
  fi
  # 1秒スリープ
  sleep 1
  count=$(( count + 1 ))
  if [ $count -eq 60 ]; then
    # 60秒でタイムアウト(イレギュラー)
    echo "LOCK TIMEOUT ERROR !!!"
    rm -f $LOCK_FILE >/dev/null 2>&1
    exit 0
  fi
done

# 以下メインプロセス
:
:
:

# プロセスの最後やexit前にシンボリックリンクを削除
rm -f $LOCK_FILE

シンボリックリンクはきちんと必ず消す事にはなるとは思うが、
念には念を、どうしても永久ループは避けるようにしたい。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする