rake任务唯一性检查

一般情况下不存在一个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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值