xargs を使用してプログラムを並列実行する 質問する

xargs を使用してプログラムを並列実行する 質問する

現在、最新のスクリプトを持っています。

#!/bin/bash
# script.sh

for i in {0..99}; do
   script-to-run.sh input/ output/ $i
done

xargsを使って並列実行したいのですが、試してみました

script.sh | xargs -P8

しかし、上記の操作は一度に 1 回しか実行されません。-n8 でもうまくいきませんでした。スクリプトの for ループで実行される行の末尾に & を追加すると、スクリプトを一度に 99 回実行しようとします。一度に 8 回だけループを実行し、合計で最大 100 回にするにはどうすればよいでしょうか。

ベストアンサー1

man ページからxargs:

このマニュアル ページでは、xargs の GNU バージョンについて説明します。xargs は、空白 (二重引用符、一重引用符、またはバックスラッシュで保護できます) または改行で区切られた項目を標準入力から読み取り、任意の初期引数に続いて標準入力から読み取った項目を指定してコマンド (デフォルトは /bin/echo) を 1 回以上実行します。標準入力の空白行は無視されます。

つまり、あなたの例では、xargsスクリプトからの出力をすべて待機して収集し、実行していますecho <that output>。それほど便利でも、あなたが望んでいたものでもありません。

引数-nは、実行される各コマンドで使用する入力からの項目の数です (ここでは、それ自体では並列処理については何も関係ありません)。

必要なことを行うには、xargs次のような操作を行う必要があります (未テスト):

printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/

それは次のように分解されます。

  • printf %s\\n {0..99}0-からまで 1 行に 1 つの数字を出力します99
  • 走るxargs
    • 取るせいぜい実行コマンドラインごとに1つの引数
    • そして走るまで一度に8つのプロセス

おすすめ記事