2012-02-28 9 views
1

私は特別なファイルへのアクセスを管理するためにlinuxでlockfileコマンドを使用しています。LinuxでlockfileコマンドのPIDを入れる方法

私のプリンシパルスクリプトが何らかの理由でクラッシュすると、プリンシパルスクリプトの新しい起動を阻止し、実行が邪魔になるようなハングロックが終了します。

ロックファイルプロセスのPIDを保存して、私がそれらを追跡し、プリンシパルスクリプトを再起動する前に適切なクリーンアップを行う方法はありますか?私は十分に明らかになった

希望は...

答えて

0

これは脆弱なメカニズムです。私は実際のファイルロックを使用することを好みます。したがって、所有するプロセスが終了すると、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より安全です。

+0

答えていただきありがとうございます。私が遭遇する問題は、コードを実行しているプロセスではなく、ロックを取得しようとしているプロセスに関連しているため、例の最初の行にハングします。したがって、スクリプトが死んでも、ロックを取得し続けると、ロックを解除できるスクリプトはなくなります... – Debugger

+0

一方、私は、あなたがファイルをロックするためにどのツールをPerlで使用しているのか知りたいです。 OSの自動クリーンアップが最適なソリューションになります。しかし同時に、それはNFSに耐えるべきです... – Debugger

+0

OK、私はいくつかの詳細を追加しました。私は世界最高のBashプログラマーではないので慎重に使用してください。ロックファイルを使用して競合状態を完全に回避できるとは思いません。 – theglauber

関連する問題