sample

二重起動防止対策

バッチを作成する際必要になってくる二重起動防止対策のテンプレートです。pgrepを使う方法やmkdirを使う方法ありますが、案外奥深いものです。たまにtouchでファイルを作成し、ファイルの存在確認で対策しているもの見ますが、これはダメです。ほぼ同時実行がされた場合ファイル存在チェックの後、ファイル作成を完了する僅かな隙間に起動が入ると二重起動します。その点、このディスクリプタロック(flock)方式の場合、完全同時実行しても二重起動は発生しません。mkdir方式を使った場合も絶対に二重起動は発生しなくなりますが、「ディレクトリを作成したまま異常終了」した場合、次の起動ができなくなり対策が厄介です。その点もflockは異常終了してもOSがロックを解放するのでこの問題も発生しません。

サンプル
#!/bin/bash

# ==============================================================================
# 安全設定(おまじない)
#   -e: コマンドが1つでも失敗したら即座に終了
#   -u: 未定義の変数(タイポなど)を使ったら即座に終了
#   -o pipefail: パイプ(|)の途中のエラーも逃さず検知して終了
# ==============================================================================
set -euo pipefail

# ==============================================================================
# 二重起動チェック処理(flock)
# ==============================================================================
# ロックファイルのパス(スクリプト名ごとに自動で分かれます)
LOCKFILE="/tmp/${0##*/}.lock"

# 9番のファイルディスクリプタにロックファイルを紐付けてオープン
exec 9>>"$LOCKFILE"

# ロックの取得を試みる(排他ロック / 取得できなければ即エラー終了)
if ! flock -n 9; then
    echo "エラー: すでにこのスクリプトは実行中です。" >&2
    exit 1
fi

# ==============================================================================
# メイン処理(ここに実行したいコマンドを書く)
# ==============================================================================
echo "=== 処理を開始します ==="

# 実験用の10秒待機
sleep 10 

echo "=== 処理が完了しました ==="

スポンサーリンク
タイトルとURLをコピーしました