[Capistrano]単一サーバに対しシェルコマンドを並行して実行したい


状況

  • 踏み台サーバがあり、各個別サーバにはそこ経由でしか入れない
  • MySQLサーバが4つある
  • MySQLサーバ4つに対し、たとえば mysqldump したい
  • 逐次実行でもいいけどえらい時間がかかるな〜って思っている
  • 踏み台サーバには、GNU parallel が入っていない……

parallel というDSLがすでにある

これは、複数サーバに対し並行実行するので、単一サーバには向かない。
gemもいい感じのものが無さそうに見える。

こんなの書いた

def run_parallel(parallel_size)
  threads = []
  parallel_size.times do |i|
    threads << Thread.new do
      logger.info "starting concurrent task in #{parallel_size} threads"
      logger.info "started - thread #{i}"
      yield i
      logger.info "finished - thread #{i}"
    end
  end
  threads.each {|t| t.join }
end

Usage

run_parallel 4 do |i|
  run 'sleep 120'
end
  • ちゃんと4並行で sleep が走る!
  • 結果、120秒前後で全ジョブが終わるはず

TODO

Good name