シェルスクリプトで複数並列で実行したいときに、xargs
の-P
オプションを使えることを知りました。
xargs
から-P
でプロセス数を指定すれば複雑な処理も並列でできるじゃん!と思いましたが、なかなかできずに詰まりました。
シェルで並列実行したいはずが、気づけばxargs
で関数に引数を渡したい人になっておりました笑
結論から言うと、以下で実現できました。
export -f function
${ARRAY} | xargs -n 1 -I{} bash -c "function {}"
具体的なシェルスクリプトだと、以下のようです。
#!/bin/bash
function randomWait() {
TARGET=$1
sec=`expr $RANDOM % 10`
sleep $sec
echo ${TARGET}
}
export -f randomWait
cat hogehoge.txt | xargs -n 1 -I{} -P 10 bash -c "randomWait {}"
例えば、hogehoge.txtに1-20までの数字をいれておくと、ランダムな順番で出力されます。
xargs
のオプション
-n
で一度に渡す引数の数を指定します。今回の関数は引数をひとつとるので、1を指定しています。
-I
で置換文字列を指定しています。{}
を指定して、randomWait
に引数を渡すようにしています。
-P
で並行実行プロセス数を指定しています。
export
のオプション
-f
でシェル変数としてexportしています。これでコマンドとして認識されます。
bash
のオプション
-c
で後に指定する文字列をコマンドを引数つきで実行してくれます。
参考
https://qiita.com/D-3/items/8bdb834ff53256cef481
http://171rr.blog.fc2.com/blog-entry-14.html