Humanity

Edit the world by your favorite way

依存関係があるcron jobのロックファイルを作る便利関数

ニュース - アフラックのシステム障害、原因は「バッチ処理の突き抜け」:ITpro
今更ですがふとこんなニュースを見かけて思い出したので。
まぁバッチ処理の突き抜けとは関係なくて、処理を確実に遂行するためのノウハウとかではないし、単にロックファイルの話です。

  1. 処理を開始したらロックファイルを作る
  2. ロックファイルが存在していたらexit & アラート
  3. 無事ロックファイルを作成できたら、依存するバッチ処理のロックファイルがなくなるまでブロックする
  4. 長期間(3日間)ブロックし続けていたらkill children & exit & アラート
    • 今考えるとkillしなくてもいいかも...*1

こんな事をしてくれるシェル関数を定義したスクリプト(/path/to/shell-function)をどこかに置いて、cronのスクリプトで使ってます。
cronから呼び出すスクリプトはこんな感じ。

. /path/to/shell-function

invoke_script --depends=backup backup-report /path/to/script

依存するjobがないjobの場合はシンプルにこんな感じ。

. /path/to/shell-function

invoke_script backup /path/to/script

このinvoke_scriptはこんな関数。
set -eなシェルスクリプトから呼び出されても死なないよう作ってあります。*2



引数が不正な時もexit 1する等修正


cron jobの依存関係とかロックファイルとか、その他cron jobスクリプト書く時に面倒な決まり事って皆さんどんな工夫してるのか教えてください。

*1:趣味でやってる自宅サーバだしやる気のある時しか管理しないので、とりあえずkillにしてしまった...

*2:「|| true」とかはそれの対策