17

次のロックメカニズムは、cronジョブが同時に実行されるのを防ぐために使用されます。

#!/bin/bash

echo "Before critical section"
(
    flock -e 200
    echo "In critical section"
    sleep 5
) 200>/tmp/blah.lockfile
echo "After critical section"

2つのインスタンスを一緒に実行する場合、後者は最初のインスタンスが終了するまで待機してから実行します。これにより、実行を待機しているスクリプトのバックログが発生する可能性があります。

flockこのスクリプトを変更して、ロックを取得できない場合にスクリプトを終了するようにするにはどうすればよいですか?私は-n成功せずに試しました。

4

2 に答える 2

22
flock -n -e 200 || exit 1

flock -n失敗コード (ゼロ以外) を返すことで、失敗したことを示します。代わりset -eに、スクリプトの先頭で実行して、チェックされていないエラーが発生したときにスクリプトを終了させることができます。

アプリケーションによってはexit 0、ロックを取得できないときに成功を示したい場合があります。

于 2011-08-14T14:29:56.697 に答える
14

スクリプトファイル自体に排他ロックを使用し$0ます。これはコマンドファイルの名前です。

exec 200<$0
flock -n 200 || exit 1

ソリューション全体は2行のコードで構成されています。しかし、秘訣は、読み取り用に$ 0を開いてから、その排他ロックを取得することです。

于 2011-09-05T08:15:46.690 に答える