読者です 読者をやめる 読者になる 読者になる

woshidan's blog

そんなことよりコードにダイブ。

crontabの内容を管理するgem whenever の使い方を復習した

ruby whenever crontab

DSLっぽいrubyを使ってcrontabの内容を管理するgem whenever の使い方を復習しました。

本家GitHub https://github.com/javan/whenever

# Gemfile
gem 'whenever', '= 0.9.4', :require => false
$ wheneverize .
# [add] writing `./config/schedule.rb'
[done] wheneverized!
# config/schedule.rb
# everyの引数に、時間と実行させたいtaskの内容を書いたブロックを渡す
every 1.minutes do
  # job_type :rake,    "cd :path && :environment_variable=:environment bundle exec rake :task --silent :output"
  rake "example" # lib/tasksあたりに置いているタスクだよ
end

every 1.minutes do
  # job_type :runner,  "cd :path && bin/rails runner -e :environment ':task' :output"
  runner "Sample.test" # モデルに書いたメソッドだよ
end
$ whenever
# オプション無しだとshcedule.rbを元に生成されるcrontabの内容が表示される
* * * * * /bin/bash -l -c 'cd /Users/woshidan/projects/wheneverize-ex && RAILS_ENV=production bundle exec rake example --silent'

* * * * * /bin/bash -l -c 'cd /Users/woshidan/projects/wheneverize-ex && bin/rails runner -e production '\''Sample.test'\'''

## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.
## [message] Run `whenever --help' for more options.
You have mail in /var/mail/woshidan

$ whenever --update-crontab
[write] crontab file updated

$ crontab -e
# crontabの内容が更新される
# Begin Whenever generated tasks for: /Users/woshidan/projects/wheneverize-ex/config/schedule.rb
* * * * * /bin/bash -l -c 'cd /Users/woshidan/projects/wheneverize-ex && RAILS_ENV=production bundle exec rake example --silent'

* * * * * /bin/bash -l -c 'cd /Users/woshidan/projects/wheneverize-ex && bin/rails runner -e production '\''Sample.test'\'''

# End Whenever generated tasks for: /Users/woshidan/projects/wheneverize-ex/config/schedule.rb

テスト用タスクの中身。

# lib/tasks/example.rb
task example: :environment do
  Rails.logger.info "example: #{Time.current}"
end

# app/models/sample.rb
class Sample
  def self.test
    Rails.logger.warn "test: #{Time.current}"
  end
end

久しぶりにさわるgemはうろ覚えで書いてはいけない...肝に銘じましたし...。