LoginSignup
5
5

More than 5 years have passed since last update.

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

Posted at

状況

  • 踏み台サーバがあり、各個別サーバにはそこ経由でしか入れない
  • 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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5