日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Rails 定时任务——whenever实现周期性任务

發(fā)布時間:2025/5/22 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Rails 定时任务——whenever实现周期性任务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

根據(jù)項目的進展,我們需要實現(xiàn)后臺進行定時讀取信息的功能,而最關(guān)鍵的實現(xiàn)部分是周期性功能,根據(jù)調(diào)研,決定使用whenever來實現(xiàn)這一功能。?
github:https://github.com/javan/whenever

開發(fā)前需要明確的問題

  • whenever是怎樣一種周期性機制?
  • whenever能為我們提供什么功能?
  • whenever為周期性任務(wù)提供了哪些控制方式?

問題解決

whenever周期性機制

我們來看一下github上面是怎么說的:

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

意思就是說,whenever是一個ruby gem,但同時它是基于cron jobs的。?
那么什么是cron jobs呢?我們來看一下維基百科的定義:

Cron?
crontab命令常見于Unix和類Unix的操作系統(tǒng)之中,用于設(shè)置周期性被執(zhí)行的指令。該命令從標準輸入設(shè)備讀取指令,并將其存放于“crontab”文件中,以供之后讀取和執(zhí)行。該詞來源于希臘語chronos(χρ?νο?),原意是時間。?
通常,crontab儲存的指令被守護進程激活,crond常常在后臺運行,每一分鐘檢查是否有預(yù)定的作業(yè)需要執(zhí)行。這類作業(yè)一般稱為cron jobs

也就是說,crontab是在unix和類unix系統(tǒng)中用來實現(xiàn)周期性功能的指令。在網(wǎng)上搜一下,我們就會看到很多crontab指令相關(guān)的語法。?
根據(jù)上述的分析,我們可以得出這樣的結(jié)論:?
whenever事實上是一個cron翻譯器,它將rails中的ruby代碼翻譯成cron腳本,從而將周期性的任務(wù)交給cron來執(zhí)行。 這樣,通過whenever我們可以使用ruby語言來寫周期性任務(wù)代碼,在ruby層控制代碼,而不需要與shell腳本進行切換;另一方面,我們會發(fā)現(xiàn),由于cron命令的強大,它的語法也因此變得很復(fù)雜,通過whenever,我們可以很方便的實現(xiàn)周期性任務(wù)。

whenever功能

從github中我們可以看到,我們用來實現(xiàn)定時功能的代碼都已經(jīng)集成在config/schedule.rb文件中了,以下為github中的whenever實例:

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

?

從上述實例中,我們可以看到whenever為我們提供的三種方法,runner、rake和command,事實上,還有script方法也是whenever默認支持的。除了這四種方法外,wheneverr也提供自定義方法的功能,具體做法參照github上的方法來做即可。

whenever控制方法

whenever是十分親民的,它的指令沒有cron命令那么復(fù)雜。下面提供幾種whenever比較常用的方法:

whenever (不帶參數(shù))將schedule.rb 文件中的周期性任務(wù)轉(zhuǎn)化成cron命令顯示出來,但不讀取或者寫入到crontab文件中 whenever -i [identifier] 更新新定時任務(wù),默認更新 schedule.rb 文件中的全部 whenever -w, --write-crontab, --update-crontab, [identifier] 寫定時任務(wù),默認更新 schedule.rb 文件中的全部 whenever -c, --clear-crontab [identifier] 清除 crontab

?

除此之外,cron命令也是可以是用的,比較常用的是:

crontab -l [UserName]: 列出目前的時程表 crontab -e [UserName]: 執(zhí)行文字編輯器(第一次由自己選擇編輯器)來配置crontab的具體執(zhí)行方法

一個十分簡單的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ù)時的環(huán)境,默認情況下環(huán)境為production?
上述代碼實現(xiàn)的是每兩分鐘讀取當(dāng)前時間并存入到數(shù)據(jù)庫的功能。其中,runner方法執(zhí)行的方法如下:

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

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

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

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

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

[write] crontab file updated
  • 執(zhí)行周期性任務(wù)
whenever -w

可以看到:

[write] crontab file written

此時我們的周期性任務(wù)便在后臺運行了,此時查看我們的任務(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í)行了。

需要注意的一點是運行時crontab的環(huán)境(rails和crontab環(huán)境不匹配時whenever無法執(zhí)行),一般調(diào)試時多使用的是development環(huán)境,而不設(shè)置時默認的是production環(huán)境,如果你使用crontab -l發(fā)現(xiàn)是production環(huán)境,可以使用

crontab -e

直接修改為development,或者直接將-e production刪掉即可。

經(jīng)過上述流程,我們便可以成功地實現(xiàn)周期性任務(wù)了。如果此時你發(fā)現(xiàn)自己的周期性任務(wù)還是沒有執(zhí)行,那你就得好好看看你自己的任務(wù)代碼了,很可能是執(zhí)行的任務(wù)代碼本身有問題,而與whenever的實現(xiàn)沒有太大的關(guān)系了

轉(zhuǎn)載于:https://www.cnblogs.com/andfly/p/6645606.html

總結(jié)

以上是生活随笔為你收集整理的Rails 定时任务——whenever实现周期性任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲无码一区二区三区 | 黄色在线观看免费视频 | 精品无码在线观看 | 免费看黄色大片 | 欧美国产第一页 | 无码人妻精品一区二区中文 | 一级看片免费视频 | 精产国产伦理一二三区 | 伊人色区 | 日日摸日日碰夜夜爽av | 国产粉嫩白浆 | 欧美视频在线观看视频 | 亚洲av日韩av不卡在线观看 | 国产巨乳在线观看 | 国产一级做a爱片久久毛片a | 精品无码久久久久 | 日本精品一区二区视频 | 99热香蕉| 国产无码精品久久久 | 一区二区三区伦理片 | 国产1区2区3区中文字幕 | 视频污在线观看 | 天天射寡妇射 | 国产精品日韩精品 | 男人在线视频 | 91精品国产一区二区三区香蕉 | 狠狠干综合 | 亚洲欧美日韩动漫 | 青青草91| 成人黄色在线观看视频 | 亚洲av成人精品一区二区三区 | 国产人妻人伦精品1国产 | 欧美久久激情 | 爽爽影院在线 | 嫩草99 | 日韩免费在线视频 | 亚洲一区播放 | www..com色 | 鸭子av | 久久精品10 | 久久久久亚洲av无码网站 | 日韩免费专区 | 日日干天天射 | 久久久久久久久久久久国产精品 | 一区二区三区视频 | 日本黄色片网址 | 国产老肥熟 | 成人一区二区三区在线观看 | 国产一区二区啪啪啪 | 性猛交xxxx乱大交孕妇印度 | 黑人操日本女人视频 | 亚洲欧美激情精品一区二区 | 麻豆av一区二区三区在线观看 | 成人福利在线视频 | 黄污视频网站 | 亚洲一区国产一区 | 中文字幕码精品视频网站 | 在线观看视频一区二区 | 国产精品免费一区二区区 | 一边摸上面一边摸下面 | 快播日韩| 亚洲品质自拍视频网站 | 不卡av网站| 99视频在线免费观看 | 999zyz玖玖资源站永久 | 国产第一页第二页 | 72pao成人国产永久免费视频 | 北条麻妃一区二区三区在线观看 | 欧美成人a∨高清免费观看 国产精品999视频 | 人人射av| 亚洲jlzzjizz少妇 | 成人第四色 | 五月伊人网 | 成人免费视频毛片 | www.天天干.com| 大奶子在线 | 一区二区免费在线播放 | 一级免费观看 | 国产乡下妇女三片 | 天天躁日日摸久久久精品 | 奇米777狠狠| 黄色片xxxx | 国内精品一区二区 | 超碰网站在线 | 精品人妻一区二区三区麻豆91 | 91视频在线观看 | 嫩草一区二区 | 少妇av在线 | av免费网站| 国产真实乱在线更新 | 一级片aaa| 免费成人av片 | 国产精品扒开腿做爽爽爽视频 | 探花国产精品一区二区 | 老牛av一区二区 | 欧美日韩一级二级三级 | 九九啪| 日韩中文久久 | 国内久久精品视频 |