13
シェルスクリプトの正しいロック?
シェルスクリプトの1つのインスタンスのみが同時に実行されていることを確認する必要がある場合があります。 たとえば、それ自体でロックを提供しないcrondを介して実行されるcronジョブ(たとえば、デフォルトのSolaris crond)。 ロックを実装する一般的なパターンは、次のようなコードです。 #!/bin/sh LOCK=/var/tmp/mylock if [ -f $LOCK ]; then # 'test' -> race begin echo Job is already running\! exit 6 fi touch $LOCK # 'set' -> race end # do some work rm $LOCK もちろん、このようなコードには競合状態があります。2つのインスタンスの実行が両方とも行3の後、$LOCKファイルに触れることができる前に進むことができる時間枠があります。 cronジョブの場合、2つの呼び出しの間隔が数分あるため、これは通常問題になりません。 しかし、ロックファイルがNFSサーバー上にある場合など、問題が発生する可能性があります。その場合、いくつかのcronジョブが行3でブロックしてキューに入れることができます。NFSサーバーが再びアクティブになった場合、並列実行ジョブの雷の群れがあります。 Webで検索すると、この問題の良い解決策のように思えるツールロックランが見つかりました。これを使用して、次のようなロックが必要なスクリプトを実行します。 $ lockrun --lockfile=/var/tmp/mylock myscript.sh これをラッパーに入れるか、crontabから使用できます。 これは、使用lockf()可能な場合(POSIX)をバックにフォールflock()(BSD)。またlockf()、NFSを介したサポートは比較的広く普及しているはずです。 に代わるものはありlockrunますか? 他のcronデーモンはどうですか?適切な方法でロックをサポートする一般的なcrondはありますか?Vixie …