ruby执行周期性任务

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执行周期性任务,布布扣,bubuko.com

时间: 2024-10-10 02:54:43

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

关于ruby执行shell命令的问题

ruby执行shell命令,常用的是``,但这种有点小问题,就是这货是新建了一个子进程,这意味着如果使用``,那么整个方法内部就只能执行一次shell,如果说下面还要依靠``执行的结果,比如新建文件/文件夹什么的,那么,抱歉,你会发现找不到文件或目录,因为这货开了个子进程,然后立马往下执行,他不会等待子进程退出后再执行,所以可能会出现折耳猫一种情况:整个脚本执行完毕了,都打印退出提示了,突然莫名其妙的出现shell的执行结果... 要解决这个问题,需要使用system这种方法,具体用例这里懒得写

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

执行周期性任务 sched模块是一个通用的事件调度程序,可以对任务进行延迟调度,基于此,可以用它来实现周期性任务. # coding:utf8 import time import sched # 初始化scheduler类 # 第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞. s = sched.scheduler(time.time, time.sleep) # 被周期性调度的任务 def task(): print("run time: {}".form

ruby执行字符串代码

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

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

准备安装ruby on rails,在网上搜了下,步骤都类似,但实际安装过程中却碰到很多问题.下面详细说下: 说明下,文章是按照我尝试的过程描述的.但最终是靠 运行 railsinstaller一键式安装包才成功的(第五段),因此前面的部分大家可以看看,但不用去尝试. 一.首先要安装ruby 因为在windows下安装ruby,都是推荐下载rubyinstaller安装程序. 先进入ruby官网http://www.ruby-lang.org/en/downloads/ , 通过上面链接进入ht

周期性线程池与主要源码解析

之前学习ThreadPool的使用以及源码剖析,并且从面试的角度去介绍知识点的解答.今天小强带来周期性线程池的使用和重点源码剖析. ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor:用来处理延时任务或定时任务 定时线程池类的类结构图 ScheduledThreadPoolExecutor接收ScheduleFutureTask类型的任务,是线程池调度任务的最小单位. 它采用DelayQueue存储等待的任务: 1.DelayQueue

延迟任务的实现总结

上一篇写了使用RabbitMQ来实现延迟任务的实现,其实实现延迟任务的方式有很多,各有利弊,有单机和分布式的.在这里做一个总结,在遇到这类问题的时候希望给大家一个参考和思路. 延迟任务有别于定式任务,定式任务往往是固定周期的,有明确的触发时间.而延迟任务一般没有固定的开始时间,它常常是由一个事件触发的,而在这个事件触发之后的一段时间内触发另一个事件.延迟任务相关的业务场景如下: 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟

Rails定时任务

Rails定时任务 有一个gem包whenever 是用来写定时任务的,他的作用主要是将ruby语法转换成crontab的形式,所以本质上还是用crontab来实现定时任务的. 检查系统中是否有crontab # 默认都有 检查服务是否启动 service cron status 启动服务 service cron start 停止服务 service cron stop 重启服务 service cron restart 安装whenever 在Gemfile 中 gem 'whenever'

SD从零开始38-40

[原创]SD从零开始38 创建Billing Document 根据需要BillingBilling On Request 你可以通过手工输入凭证的号码(订单号码和Delivery note,依赖于你想要执行订单相关的还是交货相关的Billing)明确地指定哪些交易将要Billing: 如果Billing无法产生,例如因为一个billing block,系统会发行一个错误日志: 到4.5版本,在为deliveries或ordersBilling时你还可以选择单个的items或者items的部分数

Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解

在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构struct timeval{time_t tv_sec; /***second***/susecond_t tv_usec;/***microsecond***/}到底microsecond是毫秒还是微秒?? 1秒=1000毫秒(3个零),1秒=1000 000微秒(6个零),1秒=1000 000 000纳秒(9个零),1秒=1000 000 000