web-dev-qa-db-ja.com

incronジョブで一度に1つのエントリを許可しますか?

監視するディレクトリがあります。更新されたら、incron経由でコマンドを実行します。このディレクトリに複数のファイルをコピーする場合、incronは複数のコマンドを同時に実行します。 incronの1つのジョブが実行されているときに、2番目のジョブが実行されないようにする方法はありますか?ガイダンスとして このチュートリアル に従いました。

1
Shafiq

いいえ、incronには組み込みのロック機能はありません。ジョブが同時に実行されないようにする場合は、ジョブ内から実行します。

前のジョブが終了するまでジョブを遅らせたい場合は、それらをロックします。 flock コマンドを使用できます。 manページに例があります。

前のジョブが終了していない場合にジョブをスキップする場合でも、flockを使用できますが、タイムアウトは0です。ロックを取得できない場合は終了します。これは競合状態になりやすいことに注意してください。ジョブ#1がファイルの列挙を終了した直後で、ロックを解放する前に新しいファイルがコピーされる可能性があり、ジョブ#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
0
Shafiq