`
Hooopo
  • 浏览: 329656 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

rake任务唯一性检查

    博客分类:
  • Ruby
阅读更多
一般情况下不存在一个rake任务一起执行的情况。
但是有这样几种情况:
1.部署
A在本地部署到外网,同时B也部署。这样就会产生冲突。。弄不好就要再重新部署一次,很麻烦..
2.定时任务
假设一个很频繁的定时任务,放到crontab里五分钟执行一次,但是有可能前一个task在五分钟之内没有结束,这样也会产生冲突。

所以我们要对某些特殊的rake任务进行唯一性检查。如果进程里有该任务就不执行新的任务。

一个简单的例子:
namespace :namespace do
  desc "xx"
  task :task do
  $0 = "_rake_namespace_task"
  #要大于1而不是大于0,是因为ruby调用ps时候这个任务已经执行了
  raise "This  task is running!!" if %x{ps aux|grep #{$0}|awk '{print $11}'}.split("\n").count($0) > 1
    puts "Bang!!"
    sleep 600
  end
end


第一次运行rake namespace:task,一切正常!
第二次:
hooopo@x-hooopo:~/work/trunk$ rake namespace:task
(in /home/hooopo/work/trunk)
rake aborted!
This  task is running!!

(See full trace by running task with --trace)


看起来比较傻。。因为每个任务都要自己设置一个$0,然后再去找。。
如果rake提供一个获取当前task的namspace名和task名的方法就很爽了。。不过找遍rake文档也没有。。
                                                                                                                                                 
       
-------------分割线-------------------------
感谢antter~~

改了一下:test.rake
def uniq_task(t)
  $0 = ["rake", t.name].join(":")
  raise "This  task is running!!" if %x{ps aux|grep #{$0}|awk '{print $11}'}.split("\n").find_all{|x| x==$0 }.size > 1
end


namespace :namespace do
  desc "xx"
  task :task do |t|
    uniq_task(t)
    puts "Bang!!"
    sleep 600
  end
end


分享到:
评论
2 楼 Hooopo 2010-04-12  
antter 写道
namespace :foo do
task :bar do|t,argv|
puts t.name
end
end

rake foo:bar
输出 foo:bar

唯一性我会用flock

哇,这个不错~~thx!
1 楼 antter 2010-04-12  
namespace :foo do
task :bar do|t,argv|
puts t.name
end
end

rake foo:bar
输出 foo:bar

唯一性我会用flock

相关推荐

Global site tag (gtag.js) - Google Analytics