1.前言

     无论是用ruby做系统管理,还是用rails做web开发,都可能遇到周期性任务,它们按照一定时间周期(1小时,2天......)持续地触发。在ruby中,我认为一次性任务使用sidekiq来完成是非常方便的,而周期性的任务就需要用到wheneversidetiqclockwork等等gem了。

2.whenever

    首先,whenever是基于linux的cron服务的,所以,在windows平台上没有直接的方法使用该gem。whenever严格来说应该算一个cron的翻译器,将ruby代码翻译为cron脚本,从而将周期性任务转交给cron实际去完成。对于精通cron的shell程序员来说可能不值一提,但对rubyist却不是。首先,我们可以使用ruby语言来书写任务代码,在ruby层面上控制代码,避免了和一些shell脚本的切换;另外,cron命令很强大,但我总是记不住它的命令参数,为了避免一遍一遍去man它的手册,还是ruby语法比较亲民。
    首先,安装whenever:
$ gem install whenever  
   然后切换到任务编写文件夹project下,保证该文件夹下有一个config文件夹。如果是在rails项目中建立whenever任务,则config文件夹已经存在了。
$ cd /project
$ wheneverize .
    whenverize命令会在config文件夹下创建schedule.rb文件,我们的任务代码需要在该文件中定义。下面的是schedule.rb文件示例:
every 30.minutes do
runner "Blog.parseAll"
end every 30.minutes, :at => 17 do
runner "PostWeibo.post"
end every 15.minutes do
runner "WeiBo.update"
end every 30.minutes, :at => 20 do
runner "RSSGenerator.generate"
end every 1.day, :at => '2:00 am' do
command "cd /var/www/mzread/current/public && gunzip -c sitemap1.xml.gz > sitemap1.xml && touch sitemap1.xml "
end
    如示例代码,whenever默认定义了三种任务类型:runner, rake, command,我们也可以定义自己的任务,比如,下面的代码定义了脱离rails环境,独立执行ruby代码的类型:
job_type :ruby, "cd :path && /usr/bin/ruby ':task'.rb"  

every :hour do
ruby 'have_a_rest'
end
   该示例描述了:每个小时会执行一次当前文件夹下的have_a_rest.rb脚本。
   下面看看怎么将任务写入cron服务。 
$ whenever   #不带参数的whenever会显示转换程cron任务的代码,不写入cron任务表
$ whenever -w #写入cron任务表,开始执行
$ whenever -c #取消任务
   如果要查看cron任务表,也可以使用linux的命令列出所有cron任务:
$ crontab -l  

3.sidetiq

       sidetiq是sidekiq的亲兄弟,如果在rails项目中使用sidekiq来处理后台任务,那么就用sidetiq来交付周期性任务也显得比较自然。
       安装sidetiq:
$ [sudo] gem install sidetiq  

定义周期性任务:

class MyWorker
include Sidekiq::Worker
include Sidetiq::Schedulable recurrence { daily } def perform
# do stuff ...
end
end
     sidetiq和sidekiq一样,依赖于redis消息来处理消息。当rails项目启动后,这些周期性任务会自动加载执行。

4.clockwork

    clockwork和sidetiq一样,也不必依赖于cron,可以适应”跨平台“要求。下面是代码示例(clock.rb):
require 'clockwork'
include Clockwork handler do |job|
puts "Running #{job}"
end every(10.seconds, 'frequent.job')
every(3.minutes, 'less.frequent.job')
every(1.hour, 'hourly.job') every(1.day, 'midnight.job', :at => '00:00')
    启动任务:
$ clockwork clock.rb
Starting clock for 4 events: [ frequent.job less.frequent.job hourly.job midnight.job ]
Triggering frequent.job
   如果要带上rails环境,就在任务文件加入:
require './config/boot'
require './config/environment'

  

ruby执行周期性任务的更多相关文章

  1. python使用sched模块执行周期性任务和定时任务

    执行周期性任务 sched模块是一个通用的事件调度程序,可以对任务进行延迟调度,基于此,可以用它来实现周期性任务. # coding:utf8 import time import sched # 初 ...

  2. ruby执行字符串代码

    str = "a='abcd'; a.reverse" 字符串str为ruby代码,执行方法eval eval str => "dcba"

  3. notepad++上配置ruby执行环境

    1.安装NppExec 插件 2.按快捷键F6,在弹出框中输入如下命令: npp_save  cd "$(CURRENT_DIRECTORY)"  jruby "$(FI ...

  4. JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理

    本文记录: 1,使用ScheduledExecutorService的 scheduleAtFixedRate 方法执行周期性任务的过程,讨论了在任务周期执行过程中出现了异常,会导致周期任务失败. 2 ...

  5. Linux任务计划、周期性任务执行

    Linux任务计划.周期性任务执行 周期性任务执行: cron 守护进程(crond):服务,不间断地运行于后台 # service crond {start|stop|status|restart} ...

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

    根据项目的进展,我们需要实现后台进行定时读取信息的功能,而最关键的实现部分是周期性功能,根据调研,决定使用whenever来实现这一功能. github:https://github.com/java ...

  7. windows下安装ruby和 rails的痛苦经历

    准备安装ruby on rails,在网上搜了下,步骤都类似,但实际安装过程中却碰到很多问题.下面详细说下: 说明下,文章是按照我尝试的过程描述的.但最终是靠 运行 railsinstaller一键式 ...

  8. Sublime中开发Ruby

    Ruby:Sublime中开发Ruby需要注意的Encoding事项 目录 背景Sublime相关默认的文件存储编码:UTF8默认的输出控制台编码:UTF8修改默认的输出控制台编码Ruby相关默认的代 ...

  9. cronatab周期性任务

    要执行周期性任务,要保证服务运行.服务名为crond:service crond start ; systemctl start crond; 配置文件 /etc/crontab cron的日志文件 ...

随机推荐

  1. SQL Server 统计信息(Statistics)-概念,原理,应用,维护

    前言:统计信息作为sql server优化器生成执行计划的重要参考,需要数据库开发人员,数据库管理员对其有一定的理解,从而合理高效的应用,管理. 第一部分 概念 统计信息(statistics):描述 ...

  2. Asp.Net从相对路径获取绝对路径的方法(不需要httpcontext上下文也可)

    //如果拿不到当前HttpContext上下文的话可以用该方法取得绝对路径 var filePath = HostingEnvironment.MapPath("需要获取绝对路径 的 相对路 ...

  3. DataType 枚举

    命名空间:   System.ComponentModel.DataAnnotations 成员名称 说明   CreditCard 表示信用卡号码.   Currency 表示货币值.   Cust ...

  4. Stack-682. Baseball Game

    You're now a baseball game point recorder. Given a list of strings, each string can be one of the 4 ...

  5. FunDA(5)- Reactive Streams:Play with Iteratees

    FunDA的设计目标就是把后台数据库中的数据搬到内存里,然后进行包括并行运算的数据处理,最后可能再对后台数据库进行更新.如果需要把数据搬到内存的话,那我们就必须考虑内存是否能一次性容纳所有的数据,有必 ...

  6. 推荐算法之 slope one 算法

    1.示例引入 多个吃货在某美团的某家饭馆点餐,如下两道菜: 可乐鸡翅: 红烧肉: 顾客吃过后,会有相关的星级评分.假设评分如下: 评分 可乐鸡翅 红烧肉 小明 4 5 小红 4 3 小伟 2 3 小芳 ...

  7. [nuget]VS中包管理器打开后找不到其它工程的问题

    今天新建工程做小组内用的工具,打算做个winform的项目, 用vs新建了winform项目,简单分下层吧,又加了两个类库项目, 然后,要用到的包需要nuget安装,于是发生这个问题: [VS]在so ...

  8. 电脑网络IP固定地址自动改变!

    今天电脑的固定IP地址每次重启设备,会自动改变一次.所以每次重启电脑都要手动重设IP地址.网关.DNS及高级选项中的ip设置. 高级选项中的ip设置每次都有2个ip,都要我删除一个.我都崩溃了,还以为 ...

  9. Ubuntu16.04 Nvidia驱动、CUDA安装

    安装Nvidia驱动和CUDA时往往很费力,经常有莫名奇妙的错误,这次安装十分顺畅,权当记录一下,以方便以后再次安装. 一.Nvidia显卡驱动安装 sudo add-apt-repository p ...

  10. 简单shell expect程序

    1 expect程序 用的Ubuntu,本身没带expect,安装. sudo apt-get install expect (关于expect,参见http://www.tclchina.com/a ...