Rubyで自然言語っぽくcrontab管理できるwheneverを使う

あらすじ

  • cronタスクを書きたいけど、そのままctontabを書きかえたりするのはめんどいし怖い( crontab -r とか)
  • Rubyでcrontab管理をできるライブラリwheneverを使う

javan/whenever: Cron jobs in Ruby

Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs.

参考

環境

  • Ruby 2.3.0
  • Rails 4.1.6

手順

  • Gemfile に以下を追記し、 bundle install
gem 'whenever', require: false
  • bundle exec wheneverrize . でスケジュール記述するファイルを作成する
$ bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!
  • config/schedule.rb の記述はこんな感じで記述できる
    • every n hour など自然言語っぽく書けてわかりやすい
# ログ出力先
set :output, "log/cron.log"
# productionの場合はproductionに
set :environment, "development"

# 3時間毎、他にも色々書き方ある(公式のREADME参照)
every 3.hours do
  # Rails内のメソッド実行するときはrunner
  runner "MyModel.some_process"
  # rakeタスクの場合はrake
  rake "my:rake:task"
  # コマンド自体も記述できる
  command "/usr/bin/my_great_command"
end

# いわゆるcronの書式でも書ける
every '0 0 27-31 * *' do
  command "echo 'hello'"
end

crontab更新と削除

$ bundle exec whenever --clear-crontab
[write] crontab file 
$ bundle exec whenever --update-crontab
[write] crontab file updated

スケジュール確認

  • bundle exec whenever で確認
$ bundle exec whenever
* * * * * /bin/bash -l -c 'cd /Users/kk_Ataka/github/sample_whenever 実行するタスク'

## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.
## [message] Run `whenever --help' for more options.
  • crontab -l でも反映されている事確認できる
# Begin Whenever generated tasks for: /Users/kk_Ataka/github/sample_whenever/config/schedule.rb
0 * * * * config/schedule.rbに定義したcron

# End Whenever generated tasks for: /Users/kk_Ataka/github/sample_whenever/config/schedule.rb
  • 同じサーバー内の複数のプロジェクトで whenever --update-crontab , whenever --clear-crontab を実行しても、そのプロジェクトに紐づくcronのみ削除されるので安心

関連記事(この記事の初版より古い記事はリンクがグレーで表示されます)

  1. 2016/08/31 [Ruby] Rubyの変数DATABASE_URLでハマった話
  2. 2016/02/17 [Ruby] [Mac] El Capitan上に古いpumaをインストールすると失敗する
  3. 2017/03/30 [Ruby] rbenvを最新にして新しいバージョンのRubyをインストールできるようにする
  4. 2015/02/28 [Ruby] rubyXLを使ってExcelを操作したい
  5. 2014/08/28 [Sphinx] [Ruby] [イベント] kawasaki.rb #015 でSphinx導入事例の発表をしてきました #kwskrb #sphinxjp
  6. 2014/07/13 [Sphinx] [Ruby] [イベント] kawasaki.rb #013 でSphinx導入事例の発表をしてきました と #011 #012 参加記録 #kwskrb #sphinxjp
  7. 2014/04/01 [Ruby] [Jekyll] [イベント] kawasaki.rb #010 で発表してきました #kwskrb
  8. 2014/01/28 [Jekyll] [GitHub] [Ruby] Jekyllプロジェクトへpull requestを行う手順(したとは言っていない)
  9. 2013/12/24 [Ruby] RubyでQRコードを生成してみる
  10. 2013/09/07 [Ruby] [Git] [Jekyll] Jekyllバージョンアップの際に思いのほか手こずった話 てっく煮さん製プラグインの更新に追従したい編
  11. 2013/09/03 [Ruby] [Rails] Ruby1.9.3のWebrickで出るCould not determine content-length...エラーを消す方法(2.0.0では解決済)
  12. 2013/08/26 [Ruby] ソースコード中に0xC2A0(UTF-8のNO-BREAK SPACE)が混ざり実行できなくて困った話
  13. 2013/08/20 [Ruby] [Rails] [Redmine] Rails3のログ出力にANSIカラーコードを使用しない設定
  14. 2013/08/09 [Ruby] [Redmine] [MySql] [StartUp] WindowsにRedmine2.3をインストールする手順と、プラグイン作成用メモ
  15. 2013/08/07 [Ruby] [Jekyll] [Git] Jekyllバージョンアップの際に思いのほか手こずった話 Jekyll Bootstrapの更新に追従したい編