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. JS的__proto__与prototype

    一.prototype和__proto__的概念 prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象.它是显示修改对象的原型的属性. __p ...

  2. EBS R12 探索之路【EBS 经典SQL分享】

    http://bbs.erp100.com/thread-251217-1-1.html 1. 查询EBS 系统在线人数 SELECT U.USER_NAME ,APP.APPLICATION_SHO ...

  3. Android 了解1G 2G 3G 知识

    了解1G 2G 3G 相关知识,对网络通讯制式进行了解即可 1.这种网络通讯制式是一步一步发展起来的,由最开始的1G(最典型的手机,例如:大哥大,1G这种制式只能语音通话). 2.后来出现的2G,2G ...

  4. Excel 帮助无法正常工作的解决方法

    Excel 中出现错误:帮助无法正常工作,但您仍可以转到 Office.com,以获得最新和最好的文章.视频和培训课程. 英文消息:Help isn't working, but you can st ...

  5. nginx backend 健康检查

    ngx_http_proxy_module 模块和ngx_http_upstream_module模块(自带) 严格来说,nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的n ...

  6. vs2017 xamarin新建单独UWP类库提示不兼容

    One or more projects are incompatible with UAP,Version=v10.0 (win10-arm). One or more projects are i ...

  7. BitAdminCore框架更新日志20180531

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...

  8. C#跨线程操作UI

    WPF启动调度器 : Dispatcher.Invoke(new Action(() => { //你的代码 }));

  9. JAVA 从头开始<五>

    一.反编译 java代码 javac编译后的class文件,想要看得懂,需要使用反编译工具 使用bin目录下的java开发工具(javap.exe) 二.构造函数 三.构造代码块 1.类中可能有多个构 ...

  10. js form 表单 重置 清空

    清空 和 重置的差异是 清空是彻底清空input内容即便初始值value有值,重置是将input内容重置为value初始状态 很简单记录下 方便之后使用 //重置 //document.getElem ...