スクリプトの実行に時間がかかるのをなんとかしたい
シェルスクリプトで複数のコマンドを実行させたいとき、上から順に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さんより、よりシンプルな方法を教えていただきました。ありがとうございました。