1. ホーム
  2. bash

[解決済み] Bashスクリプトを最大プロセス数で並列化する

2023-01-25 06:43:38

質問

Bashでループがあるとします。

for foo in `some-command`
do
   do-something $foo
done

do-something は cpu バインドされており、私はきれいな 4 コア プロセッサを持っています。最大で 4 コアまで使えるようにしたいです。 do-something を一度に実行できるようにしたいのです。

という素朴な考え方のようです。

for foo in `some-command`
do
   do-something $foo &
done

これは すべて do-something を一度に実行することは可能ですが、いくつかの欠点があります。 すべて を一度に実行すると少し遅くなる可能性があります。もうひとつの問題は、このコードブロックはすぐに戻るので、すべての do-something が終了したときに他の作業をする方法がないことです。

このループをどのように書けば、常にX個の do-something が同時に実行されるようにするには、どのように書けばよいでしょうか。

どのように解決するのですか?

何をしたいかによりますが、xargsも役に立ちます(こちら:pdf2psでドキュメントを変換する)。

cpus=$( ls -d /sys/devices/system/cpu/cpu[[:digit:]]* | wc -w )

find . -name \*.pdf | xargs --max-args=1 --max-procs=$cpus  pdf2ps

docsから。

--max-procs=max-procs
-P max-procs
       Run up to max-procs processes at a time; the default is 1.
       If max-procs is 0, xargs will run as many processes as  possible  at  a
       time.  Use the -n option with -P; otherwise chances are that only one
       exec will be done.