init.d
私のお気に入りのアプリケーションの1つにサービスラッパー(スクリプト)を作成しようとしています。アプリケーションが同時に生成されます。PIDとロックファイルだから私は私のアプリケーションの正確な状態を報告し、私のサービスが複数のコピーを開始するのを防ぐためにそれを使用しようとします。
残念ながら、アプリケーション(またはシステム)が時々クラッシュしてPIDとロックファイルが残っているため、アプリケーションが実行されていることを確認するためにこれらのファイルが存在することを確認することはできません。
POSIX
WRITE
によると、アプリケーションはロックされたファイルにロックを生成しますが、lslocks
create 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