【シェルスクリプト】xargs でお手軽に並列処理をやってみる

どーも、ぐるたか@guru_takaです。

シェルスクリプトで重い処理をマルチで実行する必要があったのですが、その時に並列処理できるxargs の存在を知りました

実際に試したのですが、本当に並列処理でき、感動したのでシェアします!参考になれば幸いです。

xargs とは?

xargs とは、以下のようなコマンドになります。
標準入力やファイルからリストを読み込み、コマンドラインを作成して実行する
引用:【 xargs 】コマンド――コマンドラインを作成して実行する

標準入力から受け取ったデータを引数に、コマンドを実行できる感じです。

引数を渡した並列処理のコマンド

xargs のオプションに -P をつけると、並列処理できます。

サンプルをみた方がわかりやすいので、早速紹介します。

並列処理のサンプル

echo.sh
#!/bin/zsh

echo "catch $1"

# 実行時間 待機
sleep 1

echo "hello $1"

そしてコマンドを以下のように打ち込んでみます。

コマンドライン
$ seq 5 | xargs -P 5 -I{} sh ./echo.sh {}

処理の流れはこんな感じ!

STEP.1
seq 5 |
1, 2 … 5 のデータをxargsにパス
STEP.2
xargs -P 5
並列処理(プロセス数は5に指定)
STEP.3
-I{} sh ./echo.sh {}
パスされたデータ 1, 2 … 10 を第1引数 {} として sh ./echo.sh にパス

実行結果は以下のようになります。

結果
catch 1
catch 2
catch 3
catch 4
catch 5
hello 1
hello 2
hello 3
hello 4
hello 5

見事に並列処理できています!

並列処理のオプション -P を外すと、結果は歴然!

コマンドライン
$ seq 5 | xargs -I{} sh ./echo.sh {}
catch 1
hello 1
catch 2
hello 2
catch 3
hello 3
catch 4
hello 4
catch 5
hello 5

実際にやってみると、処理時間の違いも体験できます。並列処理つよい!

最後に

以上になります。xargs を使いこなせば、様々な処理を短い構文で高速に処理できます!

使うタイミングがありましたら、ぜひお試しください。感動しますよ!笑

参考リンク

参考 xargs を使ってカジュアルに並列処理たごもりすメモ 参考 xargsでサクッと書くQiita

コメントを残す