1

lockfileLinuxでコマンドを使用して、特別なファイルへのアクセスを管理しています。

プリンシパルスクリプトが何らかの理由でクラッシュすると、プリンシパルスクリプトの新規起動を妨げ、その実行を大幅に煩わせるロックを解除します。

ロックファイルプロセスのPIDをストックして、主要なスクリプトを再起動する前にそれらを追跡して適切なクリーンアップを行う方法はありますか?

私が十分に明確であったことを願っています...

4

1 に答える 1

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    

または、これはどうですか:

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 で行っていることと同様であり、私が考えることができる代替手段よりも安全です。

于 2012-02-28T20:45:13.033 に答える