
監視するディレクトリがあります。更新されると、incron 経由でいくつかのコマンドを実行します。このディレクトリに複数のファイルがコピーされると、incron は複数のコマンドを同時に実行します。incron の 1 つのジョブが実行されているときに、2 番目のジョブが実行されないようにする方法はありますか?このチュートリアルガイダンスのため。
答え1
いいえ、incron にはロック機能が組み込まれていません。ジョブが同時に実行されないようにしたい場合は、ジョブ内で実行してください。
前のジョブが終了するまでジョブを遅らせたい場合は、ジョブにロックをかけます。flock
コマンド。マニュアルページに例があります。
前のジョブが終了していない場合にジョブをスキップする場合は、 を使用できますflock
が、タイムアウトは 0 です。ロックを取得できない場合は終了します。これは競合状態になりやすいことに注意してください。ジョブ #1 がファイルの列挙を終了した直後に、ロックを解放する前に新しいファイルがコピーされ、ジョブ #2 はロックがまだ保持されていることを確認し、ファイルを処理せずに終了する可能性があります。この競合を解決する簡単な方法はありません。
答え2
最も簡単な解決例: 1 はファイルがロックされていること (前のスクリプトがすでに実行中)、0 はロック解除されていること (プロセスが実行されていない) を意味します。
では、コードはこちらです
state=`cat /tmp/my_lck`
if [ "$state" -eq 1 ];then
echo "Already executing!!!"
exit
else
#Lock the file
echo 1 > /tmp/nws_lck
#Put you code here
#Unlock
echo 0 > /tmp/nws_lck
fi