Edited at

メモ:複数のコマンドを並列実行する簡易コマンド

GNU parallelをインストールせずに並列実行を実現したかったので、そのとき作ったShellのメモ


ちなみにGNU parallelを使った場合はこんなかんじ

% time parallel -j 2 {} << EOF

echo 1;sleep 5;
echo 2;sleep 5;
EOF
1
2
parallel -j 2 {} <<<' echo 1;sleep 5; echo 2;sleep 5;' 0.22s user 0.23s system 8% cpu 5.500 total


処理部分

CPU_CORE=2

parallel_exec () {
for i in "$@"; do echo $i; done | xargs -I{} -P ${CPU_CORE} sh -c {}
}


使用方法

parallel_exec "コマンド1" "コマンド2"


使用例

$ parallel_exec "echo hoge" "echo foo"

hoge
foo


実行時間計測結果

$ time parallel_exec "sleep 3; echo hoge" "sleep 1; echo foo"

foo
hoge

real 0m3.021s
user 0m0.011s
sys 0m0.014s

sleep 1の foo が先に出力され、全体の実行時間も約3秒なので期待通り。


エラー時の挙動

ちなみにスクリプト中のコマンドでエラーが発生すると parallel_exec 自体もエラーコードを返してくれる

$ parallel_exec "sleep 3; exit 0" "sleep 1; exit 1"

$ echo $?
1