Rails 定时任务——whenever实现周期性任务
根據(jù)項(xiàng)目的進(jìn)展,我們需要實(shí)現(xiàn)后臺(tái)進(jìn)行定時(shí)讀取信息的功能,而最關(guān)鍵的實(shí)現(xiàn)部分是周期性功能,根據(jù)調(diào)研,決定使用whenever來實(shí)現(xiàn)這一功能。?
github:https://github.com/javan/whenever
開發(fā)前需要明確的問題
- whenever是怎樣一種周期性機(jī)制?
- whenever能為我們提供什么功能?
- whenever為周期性任務(wù)提供了哪些控制方式?
問題解決
whenever周期性機(jī)制
我們來看一下github上面是怎么說的:
Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs.
意思就是說,whenever是一個(gè)ruby gem,但同時(shí)它是基于cron jobs的。?
那么什么是cron jobs呢?我們來看一下維基百科的定義:
Cron?
crontab命令常見于Unix和類Unix的操作系統(tǒng)之中,用于設(shè)置周期性被執(zhí)行的指令。該命令從標(biāo)準(zhǔn)輸入設(shè)備讀取指令,并將其存放于“crontab”文件中,以供之后讀取和執(zhí)行。該詞來源于希臘語chronos(χρ?νο?),原意是時(shí)間。?
通常,crontab儲(chǔ)存的指令被守護(hù)進(jìn)程激活,crond常常在后臺(tái)運(yùn)行,每一分鐘檢查是否有預(yù)定的作業(yè)需要執(zhí)行。這類作業(yè)一般稱為cron jobs。
也就是說,crontab是在unix和類unix系統(tǒng)中用來實(shí)現(xiàn)周期性功能的指令。在網(wǎng)上搜一下,我們就會(huì)看到很多crontab指令相關(guān)的語法。?
根據(jù)上述的分析,我們可以得出這樣的結(jié)論:?
whenever事實(shí)上是一個(gè)cron翻譯器,它將rails中的ruby代碼翻譯成cron腳本,從而將周期性的任務(wù)交給cron來執(zhí)行。 這樣,通過whenever我們可以使用ruby語言來寫周期性任務(wù)代碼,在ruby層控制代碼,而不需要與shell腳本進(jìn)行切換;另一方面,我們會(huì)發(fā)現(xiàn),由于cron命令的強(qiáng)大,它的語法也因此變得很復(fù)雜,通過whenever,我們可以很方便的實(shí)現(xiàn)周期性任務(wù)。
whenever功能
從github中我們可以看到,我們用來實(shí)現(xiàn)定時(shí)功能的代碼都已經(jīng)集成在config/schedule.rb文件中了,以下為github中的whenever實(shí)例:
every 3.hours do # 1.minute 1.day 1.week 1.month 1.year is also supported runner "MyModel.some_process" rake "my:rake:task" command "/usr/bin/my_great_command" end 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 every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday runner "Task.do_something_great" end every '0 0 27-31 * *' do command "echo 'you can use raw cron syntax too'" end # run this task only on servers with the :app role in Capistrano # see Capistrano roles section below every :day, :at => '12:20am', :roles => [:app] do rake "app_server:task" end?
從上述實(shí)例中,我們可以看到whenever為我們提供的三種方法,runner、rake和command,事實(shí)上,還有script方法也是whenever默認(rèn)支持的。除了這四種方法外,wheneverr也提供自定義方法的功能,具體做法參照github上的方法來做即可。
whenever控制方法
whenever是十分親民的,它的指令沒有cron命令那么復(fù)雜。下面提供幾種whenever比較常用的方法:
whenever (不帶參數(shù))將schedule.rb 文件中的周期性任務(wù)轉(zhuǎn)化成cron命令顯示出來,但不讀取或者寫入到crontab文件中 whenever -i [identifier] 更新新定時(shí)任務(wù),默認(rèn)更新 schedule.rb 文件中的全部 whenever -w, --write-crontab, --update-crontab, [identifier] 寫定時(shí)任務(wù),默認(rèn)更新 schedule.rb 文件中的全部 whenever -c, --clear-crontab [identifier] 清除 crontab?
除此之外,cron命令也是可以是用的,比較常用的是:
crontab -l [UserName]: 列出目前的時(shí)程表 crontab -e [UserName]: 執(zhí)行文字編輯器(第一次由自己選擇編輯器)來配置crontab的具體執(zhí)行方法一個(gè)十分簡(jiǎn)單的whenever demo
1.添加whenever(Gemfile)
gem 'whenever', :require => false2.生成config/schedule.rb文件?
執(zhí)行命令:
3.添加自己的周期性任務(wù)?
在config/schedule.rb文件中添加:
其中,set :environment, :development是設(shè)置執(zhí)行任務(wù)時(shí)的環(huán)境,默認(rèn)情況下環(huán)境為production?
上述代碼實(shí)現(xiàn)的是每?jī)煞昼娮x取當(dāng)前時(shí)間并存入到數(shù)據(jù)庫的功能。其中,runner方法執(zhí)行的方法如下:
這樣,在rails中實(shí)現(xiàn)whenever的代碼就算是寫完了,真的是簡(jiǎn)單到不行啊!(實(shí)在忍不住感慨一句)?
下面就要執(zhí)行周期性任務(wù)了。
4.執(zhí)行周期性任務(wù)?
在rails工程文件夾下進(jìn)行一下操作
- 更新schedule.rb中的任務(wù)到cronjob中
可以看到這樣的打印結(jié)果:
[write] crontab file updated- 執(zhí)行周期性任務(wù)
可以看到:
[write] crontab file written此時(shí)我們的周期性任務(wù)便在后臺(tái)運(yùn)行了,此時(shí)查看我們的任務(wù):
crontab -l可以看到以下打印:
# Begin Whenever generated tasks for: /home/vito/rails/test_of_rails/test_rails/config/schedule.rb 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 * * * * /bin/bash -l -c 'cd /home/vito/rails/test_of_rails/test_rails && bundle exec bin/rails runner -e development '\''Timetest.mytime'\''' # End Whenever generated tasks for: /home/vito/rails/test_of_rails/test_rails/config/schedule.rb這樣,我們的周期性任務(wù)就算是在順利執(zhí)行了。
需要注意的一點(diǎn)是運(yùn)行時(shí)crontab的環(huán)境(rails和crontab環(huán)境不匹配時(shí)whenever無法執(zhí)行),一般調(diào)試時(shí)多使用的是development環(huán)境,而不設(shè)置時(shí)默認(rèn)的是production環(huán)境,如果你使用crontab -l發(fā)現(xiàn)是production環(huán)境,可以使用
crontab -e直接修改為development,或者直接將-e production刪掉即可。
經(jīng)過上述流程,我們便可以成功地實(shí)現(xiàn)周期性任務(wù)了。如果此時(shí)你發(fā)現(xiàn)自己的周期性任務(wù)還是沒有執(zhí)行,那你就得好好看看你自己的任務(wù)代碼了,很可能是執(zhí)行的任務(wù)代碼本身有問題,而與whenever的實(shí)現(xiàn)沒有太大的關(guān)系了
轉(zhuǎn)載于:https://www.cnblogs.com/andfly/p/6645606.html
總結(jié)
以上是生活随笔為你收集整理的Rails 定时任务——whenever实现周期性任务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经典机器学习算法系列3-k近邻算法
- 下一篇: 文件搜索命令