rakeタスク一意性チェック

1854 ワード

通常、rakeタスクが一緒に実行される場合はありません.
しかし、いくつかの状況があります.
1.配置
Aはローカルで外部ネットワークに配備され、Bも配備される.これで衝突が発生します.のうまくいかないともう一度再配置しなければならないので、面倒です.
2.タイミングタスク
頻繁なタイミングタスクをcrontabに5分に1回実行すると仮定しますが、前のtaskが5分以内に終了しない可能性があります.これにより衝突も発生します.
だから、いくつかの特殊な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("
").count($0) > 1 puts "Bang!!" sleep 600 end end

初めてrake namespace:taskを実行して、すべて正常です!
2回目:
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のnamespace名とtask名を取得する方法を提供すれば爽やかです.しかし、rakeドキュメントを探してもありません.の
                                                                                                                                                 
       
------------------------------------------------------
ありがとう~
変更しました: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("
").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