【RubyOnRails】 wheneverによるcronの設定


wheneverというgemを使うと定期処理をcronに設定する事が簡単にできます。

whenever
https://github.com/javan/whenever

まずはローカル環境で設定

gemのインストール
# vi Gemfile

gem 'whenever', :require => false

# bundle install

Installing whenever (0.9.2)

schedule.rbを作成
# bundle exec wheneverize .

[add] writing `./config/schedule.rb'
[done] wheneverized!

# vi config/schedule.rb
毎朝6:00にメソッド実行

set :output, "log/cron.log"
set :enviroment, :production
every 1.day, :at => '6:00 am', :roles => [:batch] do
   runner "MailDownloadCountLogic.send_mail"
end

schedule.rbのサンプル

# 3時間毎
every 3.hours do
  runner "MyModel.some_process"
  rake "my:rake:task"
  command "/usr/bin/my_great_command"
end
# 毎朝4:30
every 1.day, :at => '4:30 am' do
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end
# 毎時
every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
  runner "SomeModel.ladeeda"
end
# 日曜の12時
every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
  runner "Task.do_something_great"
end
# 毎月27日から31日の0時0分
every '0 0 27-31 * *' do
  command "echo 'you can use raw cron syntax too'"
end

# capistranoでデプロイする際にcronを設定するサーバをrolesで指定
every :day, :at => '12:20am', :roles => [:app] do
  rake "app_server:task"
end

これでローカル環境の設定はひとまず終了。
(capistranoとの連携はまた今度)

以下はPRODUCTION環境で設定

wheneverからcrontabに設定。
$ cd /rails_root/
$ bundle exec whenever –update-crontab
[write] crontab file updated

crontab確認
$ crontab -l

# Begin Whenever generated tasks for: /var/www/hogehoge/releases/20140311064007/config/schedule.rb
0 6 * * * /bin/bash -l -c 'cd /var/www/hogehoge/releases/20140311064007 && script/rails runner -e production '\''MailDownloadCountLogic.send_mail'\'' >> log/cron.log 2>&1'
# End Whenever generated tasks for: /var/www/hogehoge/releases/20140311064007/config/schedule.rb

時間になったが動いていない模様。ログを確認。
$ more current/log/cron.log
/usr/bin/env: ruby: そのようなファイルやディレクトリはありません
/usr/bin/env: ruby: No such file or directory

ネットで検索してみると「sudoはセキュリティ上PATHを引き継がないらしい」とのこと
sudoをつけるとコマンドが見つからないというのを聞いて実際にコマンド叩いてみた。
$ /usr/bin/env ruby -v
ruby 1.9.3p545 (2014-02-24) [x86_64-linux]
$ sudo /usr/bin/env ruby -v
ruby 1.9.3p545 (2014-02-24) [x86_64-linux]
sudoつけても普通に動作する!?

でもPATHを追加してみた
$ vi ~/.bashrc
export PATH=/usr/local/bin:$PATH
alias sudo=’sudo env PATH=$PATH’

これで再度cronから実行したら動きました。
う~んよくわからん。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です