2008年9月26日金曜日

cronとrun-partsを使って、任意の順番でスクリプトを実行する

Linux (確認はCentOS4と5) をインストールしたら、 "/etc/crontab" に最初からrun-partsの実行が登録してある。
※もしも入ってない場合は、特殊なケースかと思うけど、「crontab」 パッケージに入っているので入れます。
 

crontab はこんな感じ。


# run-parts
01 * * * * root run-parts /etc/cron.hourly
59 4 * * * root run-parts /etc/cron.daily
5 4 * * 0 root run-parts /etc/cron.weekly
9 4 1 * * root run-parts /etc/cron.monthly

 
 

run-parts ってなにさ


引数でディレクトリを指定すると、ディレクトリ内の実行可能ファイルを名前順に実行する コマンドです。
run-parts /etc/cron.daily」 と指定があったら、 "/etc/cron.daily/"以下の実行対象を全部ですが一つずつ実行してくれます。
サブディレクトリは無視、あと、ファイル名も使える文字が決まってたはず、"英数-(ハイフン)_(アンダーバー)"あたりだったかな。
 
この名前順という性質は利用できる。
 
 

運用専用ディレクトリを作る


さて、run-parts に食わせる運用的なスクリプトの入れ物を作ります。
大体下記のような構成のツリーを作りますね、共通場所とログ場所は好みですけど作っといたほうがあとあとメンテナンスしやすいと思う。
work/ (cronの実行ユーザが読めればどこでもいい)
├config/ -----★共通設定ファイル置き場、"."(ドットコマンド)でスクリプトから読み込む
├logfiles/ -----★共通のログフォルダ

├dailyjob/
-----★日次で実行したいスクリプト入れ
└weeklyjob/ -----★週次で実行したいスクリプト入れ

 
 

dailyjob には何をいれるの?


使い方の一例としてはこんな感じ。

dailyjob/ 中身の例は下記ファイルたち
├00_timestamp -----★ログファイルに時刻書き込み
├05_serverstats -----★サーバのステータス出力とか
│10_stopapp -----★バックアップしたいアプリを止める
├20_appbackup -----★アプリデータのバックアップ
├30_startapp -----★止めていたアプリをスタート
└40_logbackup -----★ログなどのバックアップ

 

このケースで想定しているのは
「バックアップ前に動いてるアプリは止める必要がある、アプリは影響ある部分のバックアップが終わったらすぐ再開して、影響がない部分はゆっくりバックアップすることにしたい。また、バックアップはサーバの情報取得とかぶると重いからいや。」
という状況。(欲張りかも…)
 
ファイル名を数字で始めているので、実行される順番をコントロールできる。
あとはそれぞれのスクリプトをしっかり作っておけばOK、別々にCronだと、実行時間がかぶったりしたときの調整が大変なので、私は最近こんな感じで設定。
 
後から追加("05_" なんかはそう) できるようにちょっと数字は飛び飛びで設定しておくのもよいかもしれない。
"00_timestamp" は趣味で。
 
 

config/ ディレクトリに共通で読ませるファイルを置く


これも趣味だけど、ここに置くファイルにログファイルのパスとか使いまわせるファンクションを定義したファイルを置いておき、全部のスクリプトから "."(ドットコマンド) で読ませるようにする目的で使います。
 
もっと分かりやすいやり方もあるんでしょうけど、自分がメンテする分には今のところこの構成が楽かな。
 
ほか、run-partsは全部のスクリプトに共通の引数を渡すことができるので、例えば実行されるスクリプト側で 2 を渡せばデバッグ出力ONとか、1 もらわないと何もせず終了するなども共通で設定しておくといいかも。