Rails Gem開發(fā)(二)——whenever實(shí)現(xiàn)周期性任務(wù)

根據(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呐萨、rakecommand,事實(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è)十分簡單的whenever demo

1.添加whenever(Gemfile)

gem 'whenever', :require => false

2.生成config/schedule.rb文件
執(zhí)行命令:

wheneverize

3.添加自己的周期性任務(wù)
config/schedule.rb文件中添加:

set :environment, :development
every 2.minutes do  
runner "Timetest.mytime"  
end

其中缅叠,set :environment, :development是設(shè)置執(zhí)行任務(wù)時(shí)的環(huán)境,默認(rèn)情況下環(huán)境為production
上述代碼實(shí)現(xiàn)的是每兩分鐘讀取當(dāng)前時(shí)間并存入到數(shù)據(jù)庫的功能虏冻。其中肤粱,runner方法執(zhí)行的方法如下:

class Timetest < ApplicationRecord  
    def self.mytime    
      a = Timetest.new    
      a.time_now = Time.now    
      a.save  
    end
end

這樣,在rails中實(shí)現(xiàn)whenever的代碼就算是寫完了厨相,真的是簡單到不行傲炻!(實(shí)在忍不住感慨一句)
下面就要執(zhí)行周期性任務(wù)了蛮穿。

4.執(zhí)行周期性任務(wù)
在rails工程文件夾下進(jìn)行一下操作

  • 更新schedule.rb中的任務(wù)到cronjob中
whenever -i

可以看到這樣的打印結(jié)果:

[write] crontab file updated
  • 執(zhí)行周期性任務(wù)
whenever -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)系了朋贬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窜骄,隨后出現(xiàn)的幾起案子锦募,更是在濱河造成了極大的恐慌,老刑警劉巖邻遏,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糠亩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡准验,警方通過查閱死者的電腦和手機(jī)赎线,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糊饱,“玉大人垂寥,你說我怎么就攤上這事。” “怎么了滞项?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵狭归,是天一觀的道長。 經(jīng)常有香客問我文判,道長过椎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任戏仓,我火速辦了婚禮疚宇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柜去。我一直安慰自己灰嫉,他們只是感情好拆宛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布嗓奢。 她就那樣靜靜地躺著,像睡著了一般浑厚。 火紅的嫁衣襯著肌膚如雪股耽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天钳幅,我揣著相機(jī)與錄音物蝙,去河邊找鬼。 笑死敢艰,一個(gè)胖子當(dāng)著我的面吹牛诬乞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钠导,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼震嫉,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了牡属?” 一聲冷哼從身側(cè)響起票堵,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逮栅,沒想到半個(gè)月后悴势,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡措伐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年特纤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侥加。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叫潦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矗蕊,我是刑警寧澤短蜕,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站傻咖,受9級(jí)特大地震影響朋魔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卿操,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一警检、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧害淤,春花似錦扇雕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崭放,卻和暖如春哨苛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背币砂。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工建峭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人决摧。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓亿蒸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掌桩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子边锁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Whenever利用的是crontab,所以系統(tǒng)要支持crontab才可以使用它拘鞋,它有清析的語法砚蓬,可以和部署工具進(jìn)...
    limx閱讀 2,323評(píng)論 0 0
  • Linux定時(shí)任務(wù)Crontab命令詳解 linux 系統(tǒng)則是由 cron (crond) 這個(gè)系統(tǒng)服務(wù)來控制的。...
    孫燕超閱讀 1,823評(píng)論 0 4
  • 一盆色、什么是crontab crontab 命令常見于Unix 和 類Unix的操作系統(tǒng)中灰蛙,用于設(shè)置周期性被執(zhí)行的指...
    AQ王浩閱讀 1,209評(píng)論 0 4
  • 簡介:Crontab命令常見于Unix和類Unix的操作系統(tǒng)之中,用于設(shè)置周期性被執(zhí)行的指令隔躲。本課程通過對(duì)Cron...
    Amisuer閱讀 4,644評(píng)論 0 1
  • 鄰居后院有一棵巨大的櫻桃樹宣旱。前些天仅父,櫻桃花開了。 細(xì)碎的白花墜滿枝頭,熱烈的陽光下鋪展成素凈的繁華笙纤。 這時(shí)耗溜,他們常...
    素非_T閱讀 426評(píng)論 0 0