お気に入りのアプリケーションの1つにサービスラッパー(init.d
スクリプト)を作成しようとしています。アプリケーションは PIDとロックファイル の両方を作成するので、アプリケーションの正確なステータスを報告し、サービスが複数のコピーを開始しないようにするために、これらを使用しようとしています。
残念ながら、アプリケーション(またはシステム)がクラッシュして、PIDとロックファイルが残ることがあるため、これらのファイルの存在を確認して、アプリケーションが実行されているかどうかを判断することはできません。
POSIX
によると、アプリケーションはロックファイルにWRITE
lslocks
ロックを作成しますが、flock -x -n "$file" echo dummy
を使用してロックを作成しようとすると、驚いたことに、コマンドは成功しました。ファイルの削除も成功し(rm "$file"
)、ファイルへの書き込みも成功しました。これは、BTRFSシステムでは少し意味がありますが、それほど悪化することはありません。
では、ファイルにロック(POSIX
またはFLOCK
)があるかどうかがわかるような方法でファイルをクエリするにはどうすればよいですか?
これを実現するために、スクリプトで次の関数を使用しました。
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