web-dev-qa-db-ja.com

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

お気に入りのアプリケーションの1つにサービスラッパー(init.dスクリプト)を作成しようとしています。アプリケーションは PIDとロックファイル の両方を作成するので、アプリケーションの正確なステータスを報告し、サービスが複数のコピーを開始しないようにするために、これらを使用しようとしています。

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

POSIXによると、アプリケーションはロックファイルにWRITElslocksロックを作成しますが、flock -x -n "$file" echo dummyを使用してロックを作成しようとすると、驚いたことに、コマンドは成功しました。ファイルの削除も成功し(rm "$file")、ファイルへの書き込みも成功しました。これは、BTRFSシステムでは少し意味がありますが、それほど悪化することはありません。

では、ファイルにロック(POSIXまたはFLOCK)があるかどうかがわかるような方法でファイルをクエリするにはどうすればよいですか?

3
palswim

これを実現するために、スクリプトで次の関数を使用しました。

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
0
palswim