よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

アプリケーションに依存するバッチを"アプリケーションで自動生成"してcronに登録する方法

バッチ処理で一括処理を行うようなアプリケーションは多いかと思います。
ですがこのバッチ処理の設定をするときに、以下のようなシーンで悩まされることが多々あります。

マニュアル関連の問題として、

  • マニュアルを読みあさらないとわからない
  • バッチに関する情報が更新されていない

運用に発生しがちなミスとして、

  • 開発者と運用者の間の情報共有でバッチに関する情報が抜け落ちていた

などがあります。

これらは、情報の散乱/更新忘れ/伝達ミスなどで発生しますが、もしこれらのバッチ処理に関する情報を"アプリケーションで管理しておき、そのバッチ処理の設定作成までをアプリケーション開発者に任せ、コマンド一発で自動的に設定を生成することができれば"前述したような課題は解決するはずです。
この課題を解決するツールに、"whenever"という gem があります。

ではさっそく、使い方の解説を。

はじめにgemをインストールします。

$ gem install whenever

現時点での最新バージョンは、0.5.0です。

続いて、${RAILS_ROOT}に移動して、設定ファイル(#{RAILS_ROOT}/config/schedule.rb)を作成します。

$ wheneverize .

生成された設定ファイル(schedule.rb)を覗くと、サンプルがいくつか書いてあるため、サンプルの見様見真似で設定を書きましょう。

現バージョンだと、以下の3つの実行形態に対応しているようです。

  • commandの直書き
  • rakeタスクの指定
  • script/runner

それぞれの実行形態のデフォルト設定を変更したい場合は、下記のデフォルト設定をschecule.rb内に定義し、必要に応じて変更しましょう。

  job_type :command, ':task'
  job_type :runner,  'cd :path && script/runner -e :environment ":task"'
  job_type :rake,    'cd :path && RAILS_ENV=:environment /usr/bin/env rake :task'

バッチ処理(cron)の設定を書き終えたら、以下のコマンドでcrontab登録形式に変換表示できます。

$ whenever

※ #{RAILS_ROOT}で実行してください。
すると、コンソールに以下のように出力されるはずです。

PATH=/home/interu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

0 0 * * * cd /var/www/apps && RAILS_ENV=production /usr/bin/env rake [taskの処理] >> /var/log/apps/batch.log 2>&1

そして、上記コマンドで確認して問題がなければ、

$ whenever --update-crontab

とすることで、コマンドを実行したユーザのcrontabへ登録してくれたりもします。

Railsアプリを開発/運用している方は、是非試してみてください。

参考サイト

whenever GitHub