こんにちは、鈴木です。
シェルスクリプトを書くときに、重複起動を防止したくなることがあります。
重複起動を防止する一般的な方法として、ロックファイルを用いる方法があります。
最近 lockfile-progs パッケージ(Debian 系)に含まれるコマンドを利用する方法を知ったのでご紹介します。
導入
まずは lockfile-progs パッケージをインストールします。
1 |
apt-get install lockfile-progs |
lockfile-progs パッケージをインストールすると、以下のコマンドが使用できるようになります。
- lockfile-check
ロックファイルの存在をチェックする。 - lockfile-create
ロックファイルを作成する。 - lockfile-remove
ロックファイルを削除する。 - lockfile-touch
ロックファイルを一定時間ごとに touch する。
サンプルコード
以下にサンプルコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# ロックファイルの名前. # ここではファイル名を使用する. LOCK_FILE=$(basename $0) # ロックファイルを作成する. lockfile-create --retry 0 $LOCK_FILE || exit 1 # 終了時にロックファイルを削除する. trap "lockfile-remove $LOCK_FILE" EXIT # ロックファイルのタイムスタンプを定期的に更新する. lockfile-touch $LOCK_FILE & # ここにスクリプトで行いたい処理を記述する. echo OK |
最初に lockfile-create でロックファイルを作成します。
オプションの --retry は既にロックファイルが存在する場合のリトライ回数です。
ここでは 0 を指定しているため、既にロックファイルが存在すれば即終了します。
lockfile-remove はロックファイルを削除します。
「trap "lockfile-remove $LOCK_FILE" EXIT」としているのは、
エラーが発生した場合も含めて必ずロックファイルを削除するためです。
lockfile-touch は定期的にロックファイルのタイムスタンプを更新します。
なぜ lockfile-touch でロックファイルのタイムスタンプを更新するのかというと、
lockfile-create はロックファイルのタイムスタンプが 5 分よりも前の場合にロックを横取りするためです。
lockfile-touch はバックグラウンドで実行する必要がある(そうしないと次の処理に進めない)ため、
「lockfile-touch $LOCK_FILE &」と最後に & を付けてバックグラウンドで実行させています。
lockfile-touch した後には、本来行いたかった処理を記述すれば OK です。