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から実行したら動きました。
う~んよくわからん。