浏览 3937 次
锁定老帖子 主题:rake任务唯一性检查
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-11
最后修改:2010-04-12
但是有这样几种情况: 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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-12
namespace :foo do
task :bar do|t,argv| puts t.name end end rake foo:bar 输出 foo:bar 唯一性我会用flock |
|
返回顶楼 | |
发表时间:2010-04-12
antter 写道 namespace :foo do
task :bar do|t,argv| puts t.name end end rake foo:bar 输出 foo:bar 唯一性我会用flock 哇,这个不错~~thx! |
|
返回顶楼 | |