定时任务whenever

作者:周星 发布:2014-09-06

今天给大家分享一个 gem: whenever,whenever 让开发者简便的创建、部署定时任务。

安装:

$ gem install whenever

或者在 Gemfile 里添加

gem 'whenever', :require => false

然后在项目中执行:

wheneverize .

就在 config 目录下生成一个 schedule.rb 文件。

whenever 有三种任务类型:command、runner 和 rake,当然你也可以定义自己的任务类型

job_type :awesome, '/usr/local/bin/awesome :task :fun_level'

every 2.hours do
  awesome "party", :fun_level => "extreme"
end

       上面代码定义了一个定时任务,每两个小时执行一次 /usr/local/bin/awesome party extreme,job_type 定义的 :task 总是被被第一个参数“替换”,然后你可以自己定义一个符号变量,比如上面的 :fun_level,通过 :fun_level => "extreme",它会被 extreme 替换。

       whenever 默认的 :path 就是执行 whenever 的目录,默认的 :environment_variable 是大家熟悉的 RAILS_ENV,默认的 :environment 是 'production',所有的命令其实都是 bash -l -c 'command' 这种方式,当然你也可以通过设置 set :job_template 改变它。

       通过重写一下 rake 定时任务,通过 linux 的 flock命令,同一台机器同一个项目,在不同目录部署,防止同一个任务执行多次:

job_type :rake, "mkdir -p /tmp/blog_crontab_lock; chmod +xrw /tmp/blog_crontab_lock ; flock -xn /tmp/blog_crontab_lock/:flock.lock -c 'cd :path;PATH=#{ENV['PATH']} bundle exec rake :task RAILS_ENV=production'"

every '30 21 * * 0' do
  rake "regular_job:send_week_chosen", flock: "regular_job.send_week_chosen"
end


想了解更多,请参考 https://github.com/javan/whenever

支付宝扫码赞助博主


评论(0)