たとえば、1分間に1回、特定のキャッシュを更新して、何百万ものサイト訪問者にすばやく提供します。 すべてが順調に進みますが、毎週のバックアップが深夜に開始され、キャッシュが10秒ではなく70秒で形成され、60秒でさらに1つのキャッシュ形成プロセスがそれを追い越すまで正確になります。
そのようなシナリオでさらに起こるのは、非常に興味深い質問です。 2つのプロセスが互いに積極的に干渉し(同じオブジェクトで動作する)、その実行時間の合計が通常の2倍になることはほとんどありませんが、3番目のプロセスが追いつくと...
説明された状況は卑劣なものですが、退化したバージョンの方が一般的です:クラウンはなく、キャッシュが期限切れになる
開発者として、このようなシナリオを予測し、それから身を守る必要があります。 しかし、
シンプルで便利なlockrunユーティリティを使用します。 操作の原理は単純です。プロセスごとにファイルを作成し、ロックをかけます。 プロセスが完了すると、ロックが失われます。 ロックは、プロセスが突然死んだ場合にも消え、PIDの存在を確認したり、他の体の動きを行う必要はありません。 プロセスが再起動され、ロックファイルがまだ解放されていない場合、スクリプトは中断され、STDERRでメッセージが発行されます。
ユーティリティはCで記述されているため、使用する前にターゲットマシンでコンパイルする必要があります。 したがって、必要な場所にダウンロード、コンパイル、配置します。
$ wget unixwiz.net/tools/lockrun.c
$ gcc lockrun.c -o lockrun
$ sudo cp lockrun /usr/local/bin/
ルートでない場合は、最後の行を無視して、フルパスを指定するか、PATHを変更する必要があります。
使用例:
* * * * * /usr/local/bin/lockrun --lockfile=/tmp/megacache.lockrun -- /path/to/megacache/generator
実際には、lockrunコマンドとパラメーターは2つのマイナス記号で区切られています。
以下のパラメーターが受け入れられます。
--lockfile = / path / to / file
ロックのファイル名を指定する必須パラメーター。 そのようなファイルがない場合は、自動的に作成されます。 もちろん、各ジョブのためのファイルである必要があります。
--maxtime = N
「通常の」作業のためにスクリプトに割り当てられた秒単位の時間。 スクリプトの動作が長くなると、STDERRにメッセージが表示され、cronがメールに送信できます。
-待つ
このパラメーターが指定されている場合、lockrunはスクリプトの実行をキャンセルしませんが、前のプロセスがロックを解放するまで待機します。
-詳細
いつものように、プロセスの詳細情報を発行します。
-静かな
エラーメッセージを表示しません。 タスクの開始を拒否しても深刻な問題ではない場合は、有効にすることができます。
以上です。 ご覧のとおり、これは本当にシンプルで効果的です。
UPD:コメントの中で、Linux用のネイティブツールもあることを知りました。
もちろん、説明されたユーティリティが唯一のソリューションであると主張した人はいませんでした。