1. ホーム
  2. bash

[解決済み] xargsを使ったプログラムの並列実行

2022-03-04 10:23:42

質問

現在のスクリプトを使用しています。

#!/bin/bash
# script.sh

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

xargsを使って並列で実行したいのですが。試してみたところ

script.sh | xargs -P8

しかし、上記をやっても一度に一回しか実行されない。n8でもダメでした。 スクリプトのforループで実行する行の最後に&を追加すると、一度に99回スクリプトを実行しようとする。どうすれば、一度に8回ずつ、合計100回まで実行できるでしょうか。

解決方法は?

からの 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} - から1行に1つの数値を表示します。 0 から 99 .
  • 実行 xargs
    • 服用 たかだか 1つの実行コマンドラインにつき1つの引数
    • と実行します。 まで 一度に8プロセス