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

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

監視するディレクトリがあります。更新されると、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

関連情報