Whenever是一個使用crontab
的方式來做排程工作的gem,crontab
是一個linux內建的排程工具,詳細介紹可參考這裡。crontab
並不是目前最理想的排程方式,詳情可參考這裡。如果覺得whenever不合用的話,在rails還是有很多其他的gem可以選用,像是rufus-scheduler、Clockwork ...等,可依照自己需求做選擇。
安裝
-
先在server或開發環境上安裝
whenever
,直接於command line輸入以下指令:gem 'whenever', :require => false
-
再來就要思考要使用哪種方式執行工作,
whenever
預設支援下列幾種方式,差別可看官方文件job types部份:- rake
- runner
- command
- script
- 當然您喜歡的話,也可以自己定義一種方式
-
這裡我選擇以
lib/tasks/jobs.rakerake
的方式執行。所以在lib/tasks
裡新增一個rake檔案,這裡我使用的檔名為jobs.rake# encoding: utf-8 namespace :[namespace] do desc "這是一個rake" #此處可自行輸入task的描述 task :[your task name] => :environment do [your code here] end end end
-
接下來可以測試一下是否可正常執行,可以在command line輸入以下指令做測試:
rake -T #會列出剛新增的rake bundle exec rake [namespace]:[task] #執行rake
-
rake做完後,就要新增排程了,先產生必要的檔案,在專案目錄下以command line輸入以下指令:
wheneverize .
執行完後,會產生 config/schedule.rb 這個檔案,排程的設定可以設定在此。
-
編輯
config/schedule.rbconfig/schedule.rb
來設定排程:env :PATH, ENV['PATH'] #要用bundle時必須要加 set :output, 'log/cron.log' #設定log的路徑 every 1.day, :at => '1:00 am' do rake "[剛剛的namespace名稱]:[剛剛的task名稱]" end
-
在command line輸入以下指令來檢查排程設定是不是都正確:
whenever
此命令會以
crontab
的方式將你設定的排程指令顯示出來,如下:0 1 * * * /bin/bash -l -c 'cd [/path/to] && RAILS_ENV=production bundle exec rake [namespace]:[task] --silent >> log/cron.log 2>&1'
其中
crontab
的說明可在command line下man 5 crontab
來看說明文件,格式大致上為:分 時 日 月 星期 命令
,*
代表全部,以上面的0 1 * * *
來說,就是每天的1:00都要執行。 -
如果有使用
config/deploy.rbcapistrano
的話,可以在config/deploy.rb
加入下面程式:set :whenever_command, "bundle exec whenever" #要用bundle時必須要加,否則就不用 require "whenever/capistrano"
這樣設定的話,deploy時就會自動執行
whenever --update-crontab
將排程設定至crontab
中。
這個設定僅適用於 Capistrano 版本2以下,3以上請參考 官方文件 Capistrano V3 Integration部份
疑難排解
- 若排程沒有正常執行,可以去開啟
config/schedule.rb
中:output
設定的log檔位置,此案例中為log/cron.log
,檢查是否有錯誤訊息。 - 若錯誤訊息為
bundle command not found
請在config/schedule.rb
中加入env :PATH, ENV['PATH']
转自:http://lemonup.logdown.com/posts/169422-rails-whenever-use-note