まさ@ブログ書き込み中

自由に生きるための英語、プログラミング、考えごとについて色々書いています。

定期タスクをwhenever(cron)で実行する【初心者向け】

 

おはようございます。まさです。

一昨日はWebにおいてユーザの状態管理をセッション以外でやる方法としてjsによるpollingを紹介しました。

masa-world.hateblo.jp

 

しかし、jsに頼るとユーザがブラウザを閉じてしまった時点で状態管理ができなくなってしまいます。それでも定期的にあるモデルの状態などをチェックしたい場合は、Railsには定期タスク実行のGem「whenever」を使うといいみたいです。

 

 

wheneverとは

リポジトリはこちら。

javan/whenever · GitHub

 

gemのwheneverを導入してみた - まっしろけっけによると、

簡単に説明するとRubyのコードでcrontabの管理が出来るライブラリです。

とのこと。

 

crontabとやらを管理してある期間ごとに定期的にタスクを実行できるみたいです。

# 出力先logの指定
set :output, 'log/crontab.log'
# 実行環境の指定
set :environment, :production

# 1時間毎に実行
every :hour do
  rake 'rake:task1'
end

# 1時間毎に実行
every 1.hour do
  rake 'rake:task2'
end

# 3分毎に実行(crontabと記述方法を合わせる)
every '*/3 * * * *' do
  rake 'rake:task3'
end

 

ちなみにevery "hoge" doから始まるブロックの中にあるコードは

command: bashコマンド実行
rake: rakeタスク実行
runner: Rails内のメソッド実行
script: scriptの実行

という意味があるみたいです。

 

 

crontabってなに

僕の中でもcronとかcrontabとかっていう言葉が混在していたのですが、どうやら

  • cronとは定期的にコマンドを実行するために呼ばれるデーモンプロセス
  • crontabとはcronを実行するコマンド(crontabコマンド)を書き込むファイル

らしいです。cronはUnix系OSにおいてコマンドの定期実行を行うプロセスみたいですな。

 

crontabに書かれたcorntabコマンドは、crond(cron)デーモンにより実行されるみたいです。実行されるジョブはcron jobとも言われるみたい。

 

ここが僕にとって意外だったのですが、wikipediaでは

毎分ごとに実行すべきスケジュールがないか確認し、もし実行すべきジョブがあれば、それを実行する。

と書いてあります。つまり、crontabコマンドを書いていようが書いていまいが、一応cronは動いているのですな。

 

そのcrontabコマンドを書くにはある知識が必要なのですが、それをRubyっぽく書きやすくした上にrakeコマンドやRailsのメソッドを簡単に使えるようにしたのがwheneverです。便利。

 

 

デーモンプロセスってなに

びぎねっと - はじめる人のびぎねっと。では

デーモンは,LinuxUNIXにおいてメモリ上に常駐して様々なサービスを提供するプロセスを指します。

デーモンプロセスは処理要求を待ち続け,要求があると自分自身をコピーしたプロセスを作り,コピーしたプロセスに処理を実行させます。

とあります。

 

デーモンと言っても悪魔のデーモンではなく、守護神という意味だそう。先ほどcrond(cron)デーモンと言いましたが、まさにこの"d"はデーモンのdみたいです。

デーモンの意味は,悪魔の「demon」ではなく守護神の「daemon」です。そのため,デーモンとして動作するプログラムは,伝統的にプログラムファイル名(プロセス名)の最後に「d」が付けられています。ただし,最後に「d」が付いていないものでもデーモンとして動作するものもあります。

 

いやー勉強になりました。終わり。

 

 

参照サイト