他のプロセスのロックの確認とテスト

他のプロセスのロックの確認とテスト

init.d私のお気に入りのアプリケーションの1つにサービスラッパー(スクリプト)を作成しようとしています。アプリケーションが同時に生成されます。PIDとロックファイルだから私は私のアプリケーションの正確な状態を報告し、私のサービスが複数のコピーを開始するのを防ぐためにそれを使用しようとします。

残念ながら、アプリケーション(またはシステム)が時々クラッシュしてPIDとロックファイルが残っているため、アプリケーションが実行されていることを確認するためにこれらのファイルが存在することを確認することはできません。

POSIX WRITEによると、アプリケーションはロックされたファイルにロックを生成しますが、lslockscreate a lockコマンドを使用してロックを生成しようとするとflock -x -n "$file" echo dummy驚くほど成功するようです。ファイルの削除も成功し(rm "$file")、ファイルの書き込みも成功しましたが、これはBTRFSシステムではある程度理解されますが、それほど面倒ではありません。

POSIXそれでは、ファイルにロック(または)があるかどうかを確認するためにどのようにファイルを照会しますかFLOCK

答え1

これを行うには、スクリプトで次の関数を使用しました。

getPIDLock () {
    if [ ! -e "$LockFile" ]; then
        return 0 # Not an error, but lsof will emit a lot of text if the file doesn't exist
    fi
    local PIDLock=$( lsof -F p "$1" | head -n 1 )
    local strEcho='echo ${PID:1}'
    bash -c "PID=\"$PIDLock\";$strEcho;" # Assuming system has BASH, but not assuming that the default shell is BASH
    return 0
}

問題のファイルがロックされている場合はPIDをエクスポートし、それ以外の場合は空の文字列をエクスポートします。

PID=$( getPIDLock "/path/to/pidfile" )
if [ -n $PID ]; then
    # Do your thing
fi

関連情報