lockfile
Linuxでコマンドを使用して、特別なファイルへのアクセスを管理しています。
プリンシパルスクリプトが何らかの理由でクラッシュすると、プリンシパルスクリプトの新規起動を妨げ、その実行を大幅に煩わせるロックを解除します。
ロックファイルプロセスのPIDをストックして、主要なスクリプトを再起動する前にそれらを追跡して適切なクリーンアップを行う方法はありますか?
私が十分に明確であったことを願っています...
これは脆弱なメカニズムです。私は実際のファイル ロックを使用することを好みます。そのため、それらを所有するプロセスが終了すると、O/S が自動的にロックを解放します。perl では (flock 関数を使用して) 簡単に実行できますが、Bash で可能かどうかはわかりません。
さらに言えば、ロックファイル自体を使用して、ロックを保持しているスクリプトの PID を保持できると思いますよね?
(私はあまりシェル スクリプトを作成しません... 以下のコードはほとんど正しいと思いますが、自己責任で使用してください。競合状態があります。)
while [[ lockfile -! -r 0 lock.file ]]
do
kill -0 `cat lock.file`
if [[ $? -ne 0 ]]
then
# process doesn't exist anymore
echo $$ >lock.file
# do something important
rm -f lock.file
break
fi
sleep 5
done
または、これはどうですか:
while [[ true ]]
do
if [[ ! -e pid.file ]]
then
echo $$ > pid.file
else
if [[ kill -0 `cat pid.file`]]
then
# owner process exists
sleep 30
else
# process gone, take ownership
echo $$ > pid.file
# ### DO SOMETHING IMPORTANT HERE ###
rm -f pid.file
break
fi
fi
done
私は2番目の方が好きです。まだ完全にはほど遠い (多数の競合状態) が、ロックを求めて戦うプロセスが多すぎない場合は機能する可能性があります。また、スリープ 30は、可能であれば、ある程度のランダム性を含む必要があります (スリープの長さはランダムな要素を持つ必要があります)。
ただし、ここを参照してください。シェルの一部のバージョンで flock を使用できるようです。これは、私が perl で行っていることと同様であり、私が考えることができる代替手段よりも安全です。