👨👩👧👦
xargsでお手軽並行処理
はじめに
こんにちは!NE株式会社の tatsuo48 です。
今回はxargsコマンドについてまとめます。
xargsとは
「標準入力を読み込んでコマンドラインを作成し実行する」コマンドです。
例えば以下のように使います。
test.txt
a
b
c
$ cat test.txt | xargs -I {} echo hello {}
hello a
hello b
hello c
オプション1つで並行処理
これだけでも便利ですが、さらに強力なのがオプション1つで並行処理までできてしまうことです!
例えば、以下のように実行すると逐次実行だと合計6秒かかっています。
test.txt
1
2
3
$ time cat test.txt |xargs -I {} sleep {}
________________________________________________________
Executed in 6.07 secs fish external
usr time 13.29 millis 0.24 millis 13.04 millis
sys time 28.66 millis 3.45 millis 25.21 millis
これに -P 並行数のオプションをつけると並行実行されるため、3つのうち、最も長い3秒で全ての処理が終わります。
$ time cat test.txt |xargs -I {} -P 3 sleep {}
________________________________________________________
Executed in 3.04 secs fish external
usr time 10.86 millis 0.21 millis 10.65 millis
sys time 19.37 millis 2.61 millis 16.77 millis
使用例
複数のディレクトリで同じ処理がしたい
例えばterraform planなど
dir.txt
staging
production
$ cat dir.txt | xargs -I {} cd {};terraform init;terraform plan
Teamに紐づくGitHubリポジトリの権限を一括で変更したい
repo.txt
repo-a
repo-b
repo-c
APIリクエストならある程度並行処理でも大丈夫なので -P使う。
$ cat repo.txt | xargs -I {} -P 3 gh api --method PUT \
-H "Accept: application/vnd.github+json" \
/orgs/org名/teams/team名/repos/owner名/{} \
-f permission='push'
まとめ
簡単にですがxargsコマンドについてまとめてみました。
これ一つ覚えているだけで作業効率が格段に上がります。みなさんもぜひ使ってみてください〜
Discussion