LoginSignup
49
47

More than 5 years have passed since last update.

今までシェルスクリプトで順番に実行していたコマンドを簡単に並列実行させる方法

Last updated at Posted at 2017-01-12

スクリプトの実行に時間がかかるのをなんとかしたい

シェルスクリプトで複数のコマンドを実行させたいとき、上から順に1つずつ実行するから終わるまで時間がかかってつらい。

既存のスクリプト(上から順に実行される)

#!/bin/bash
param=huga

./hoge.sh aa 1 $param
./hoge.sh bb 2 $param
./hoge.sh cc 3 $param
./hoge.sh dd 4 $param

並列実行させる方法

#!/bin/bash
param=huga

cat << EOS | perl -pe 's/\n/\x00/' | xargs -0 -n 1 -P 3 -I{} sh -c '{}'
./hoge.sh aa 1 $param
./hoge.sh bb 2 $param
./hoge.sh cc 3 $param
./hoge.sh dd 4 $param
EOS

実行させたいコマンド群の前後におまじないを書くだけ。

ヒアドキュメントでコマンドをxargsに渡し、shで実行させています。ただ普通に渡すと半角スペースを区切りと判断してしまうので、コマンドの引数が正しく渡されません。そこで一旦改行(\n)をNULLにして、NULLを区切りにするように-0オプションを付けてます。
しかしこのままだと今度は、引数も含めた文字列全体を1つのコマンドとして認識してしまうので、「sh」ではなく「-I{} sh -c '{}'」という風にしています。ちょっとまわりくどいですね。(^^;;

これで一連のコマンドを並列実行してくれて、しかも終了するまでちゃんと待っていてくれます。xargsって素晴らしい!ちなみに -P で並列実行数を変更できます。

他にもっと簡単な方法があるよ!こうゆう場合には動かないよ!という情報がありましたら教えてください。xargsの使い方を1時間前に知ったばかりなもので。(^^;;

追記:もっとシンプルな方法

#!/bin/bash
param=huga

cat << EOS | xargs -L1 -P 3 -I{} sh -c '{}'
./hoge.sh aa 1 $param
./hoge.sh bb 2 $param
./hoge.sh cc 3 $param
./hoge.sh dd 4 $param
EOS

akaneharaさんより、よりシンプルな方法を教えていただきました。ありがとうございました。

49
47
3

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
49
47