日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 小宝贝真紧h军人h | 六月婷婷综合网 | 久久久这里有精品 | 婷婷国产成人精品视频 | 国产福利99 | 精品网站999 | 激情免费av | 嫩草影院在线免费观看 | 国产精品偷乱一区二区三区 | 日韩第九页 | 无遮挡av| 黄色高清视频在线观看 | 青青操91 | 91网国产 | 久久久www成人免费精品 | 欧美一级做性受免费大片免费 | 九九爱视频| 午夜免费看片 | 国产精品久久久久久久一区探花 | 久久999| 国产不卡视频 | 精品欧美一区二区久久久久 | 97国产| 和黑帮大佬的365 | 五月伊人婷婷 | 一区二区三区免费在线视频 | 爆操少妇 | 亚洲最大视频网 | 精产国品一二三产区m553麻豆 | 日本美女操 | 黄色网址视频 | 青青国产在线 | 亚洲欧美自拍视频 | 日本xxxxwwwww| 欧美特黄aaaaaa | 国产欧美一区在线观看 | 欧美日本三级 | 高清一区二区三区四区五区 | 国产影视av | 国产在线高清 | 中文字幕第一区 | 91精品国产一区二区三区蜜臀 | 丰满少妇毛片 | 乱淫67194| 欧美一级成人 | 欧美高清另类 | 欧美bbbbb性bbbbb视频 | free黑人多人性派对hd | 青娱乐超碰 | 国产又黄又爽又色 | 蜜桃精品噜噜噜成人av | 亚洲国产精品免费 | 欧美色欧美色 | 黄色免费网站在线观看 | 在线国产小视频 | 猎艳山村丰满少妇 | 美女扒开腿让男生桶 | 免费观看黄一级视频 | 亚洲午夜精品久久久 | 香蕉视频免费在线观看 | 操女人视频网站 | 国产又粗又猛又爽又黄又 | 亚洲老老头同性老头交j | 少妇一级淫片免费观看 | 国产一级片av | 嫩草影院懂你的影院 | 亚洲三级视频在线观看 | 正在播放久久 | 久国产 | 亚洲天堂一区二区三区四区 | 日韩av网址在线观看 | 国产suv精品一区二区60 | 国产精品亚洲第一 | av中文字幕网 | 97超级碰碰人妻中文字幕 | 涩涩视频网站在线观看 | 国产精品熟女久久久久久 | 免费在线观看你懂的 | 国产亚洲精品久久久久久久久动漫 | 欧美美女性视频 | 波多野结衣av中文字幕 | 朝桐光在线播放 | 国产香蕉在线观看 | 麻豆疯狂做受xxxx高潮视频 | 久久中文视频 | 亚洲小视频 | 日韩黄| 男人深夜网站 | 天天综合网在线观看 | 欧美综合亚洲图片综合区 | 97狠狠| 亚洲激情视频在线播放 | 成人a网站| 变态另类丨国产精品 | 你懂的网站在线 | 山村大伦淫第1部分阅读小说 | 中文字幕久久久 | 播五月婷婷| 色婷婷久久一区二区三区麻豆 |