これは脆弱なメカニズムです。私は実際のファイルロックを使用することを好みます。したがって、所有するプロセスが終了すると、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
それとも、これはどう:
私は2番目の方が良いです。完璧なもの(競合状態が多い)からはまだ遠いですが、ロックのために戦っているプロセスがあまりにも多くなければうまくいくかもしれません。また、スリープ30には、可能であればランダム性が含まれている必要があります(スリープの長さにはランダムなコンポーネントが必要です)。
しかし、ここを参照してください。it looks like you can use flock with some versions of the shellこれは、私がperlでやっているのと似ていて、私が考えることができるalotativesより安全です。
答えていただきありがとうございます。私が遭遇する問題は、コードを実行しているプロセスではなく、ロックを取得しようとしているプロセスに関連しているため、例の最初の行にハングします。したがって、スクリプトが死んでも、ロックを取得し続けると、ロックを解除できるスクリプトはなくなります... – Debugger
一方、私は、あなたがファイルをロックするためにどのツールをPerlで使用しているのか知りたいです。 OSの自動クリーンアップが最適なソリューションになります。しかし同時に、それはNFSに耐えるべきです... – Debugger
OK、私はいくつかの詳細を追加しました。私は世界最高のBashプログラマーではないので慎重に使用してください。ロックファイルを使用して競合状態を完全に回避できるとは思いません。 – theglauber