1.前言

     无论是用ruby做系统管理,还是用rails做web开发,都可能遇到周期性任务,它们按照一定时间周期(1小时,2天......)持续地触发。在ruby中,我认为一次性任务使用sidekiq来完成是非常方便的,而周期性的任务就需要用到whenever,sidetiq,clockwork等等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. Java子父类中的构造函数实例化过程

    其实我们发现子类继承父类操作很简单,如果要是去深入的研究下会发现,实例化过程并非是我们看到的那样,我们就以代码举例来说明: 问大家,以下代码执行会输出什么呢? package com.oop; /** ...

  2. rtmp官方标准规范详细解析

    标准规范学习: rtmp消息结构,包括几个部分: 时戳:4  byte,单位毫秒.超过最大值后会翻转. 长度:消息负载的长度. 类型ID:Type Id 一部分ID范围用于rtmp的控制信令.还有一部 ...

  3. Basic Auth

    开放平台 把网站服务封装成一系列接口供第三方开发者使用,这种行为就叫做Open API,提供开放API的平台本身就被称为开放平台.比如一些网站支持QQ登录,那QQ就相当于开放平台,QQ提供了一些OPE ...

  4. TCP实现一个简易的聊天室 (Unity&&C#完成)

    效果展示 TCP Transmission Control Protocol 传输控制协议 TCP是面向连接的流模式(俗称:网络流).即传输数据之前源端和终端建立可靠的连接,保证数据传输的正确性. 流 ...

  5. 在Asp.net Core中使用中间件来管理websocket

    介绍 ASP.NET Core SignalR是一个有用的库,可以简化Web应用程序中实时通信的管理.但是,我宁愿使用WebSockets,因为我想要更灵活,并且与任何WebSocket客户端兼容. ...

  6. python os.path 的使用

    import os #该文件所在位置:D:\第1层\第2层\第3层\第4层\第5层\test11.py path1 = os.path.dirname(__file__) print(path1)#获 ...

  7. MySQL查询语句练习题(面试时可能会遇到哦!)

    Sutdent表的定义 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 学号 INT(10) 是 否 是 是 是 Name 姓名 VARCHAR(20) 否 否 是 否 否 Sex 性 ...

  8. centOS 自动锁屏 解决办法

    System-->preferences --> Screensaver中 找到 Lock screen when screensaver is active 把前面的钩去掉

  9. C的Define

    #define Conn(x,y) x##y  //表示x连接y #define ToChar(x) #@x //给x加上单引号 #define ToString(x) #x  //给x加双引号 #d ...

  10. Python爬虫之关于登录那些事

    常见的登录方式有以下两种: 查看登录页面,csrf,cookie;授权:cookie 直接发送post请求,获取cookie 上面只是简单的描述,下面是详细的针对两种登录方式的时候爬虫的处理方法 第一 ...