複数のコマンドを一度に実行する

複数のコマンドを一度に実行する

利用可能なすべてのリソースを使用して、できるだけ短時間で多数の同様のコマンドを実行する必要があります。

たとえば、私の場合は画像を処理しており、次のコマンドを使用すると、 for INPUT in *.jpg do; some_command; doneコマンドは 1 つずつ実行され、使用可能なすべてのリソースが使用されるわけではありません。

しかし、その一方で、実行するとfor INPUT in *.jpg do; some_command &; doneマシンのリソースが非常に短時間で不足することになります。

atのコマンドについては知っていますbatchが、自分の場合にそれを使用できるかどうかはわかりません。間違っていたら訂正してください。

そこで、コマンドを何らかのキューに入れて、その一部だけを一度に実行しようかと考えていました。それを素早く行う方法がわからず、それが問題です。以前にも同じような問題に遭遇した人がいるはずです。

お知らせ下さい。

答え1

GNU Parallel はまさにこのために作られています:

parallel some_command {} ::: *.jpg

デフォルトでは、CPU コアごとに 1 つのジョブになります。コア数よりも 1 つ多いジョブを実行したい場合があります。

parallel -j+1 some_command {} ::: *.jpg

GNU Parallel は汎用的な並列化ツールであり、同じマシン上または SSH アクセスできる複数のマシン上でジョブを並列に実行することを容易にします。

4 つの CPU で実行したい 32 個の異なるジョブがある場合、並列化するための最も簡単な方法は、各 CPU で 8 つのジョブを実行することです。

シンプルなスケジュール

GNU Parallel は、代わりに、1 つのプロセスが終了すると新しいプロセスを生成します。これにより、CPU がアクティブな状態になり、時間が節約されます。

GNU 並列スケジューリング

インストール

セキュリティ上の理由から、GNU Parallel はパッケージ マネージャーを使用してインストールする必要がありますが、GNU Parallel がディストリビューションにパッケージ化されていない場合は、ルート アクセスを必要としない個人用インストールを行うことができます。次の操作を実行すると、10 秒で完了します。

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

その他のインストールオプションについては、http://git.savannah.gnu.org/cgit/parallel.git/tree/README

もっと詳しく知る

その他の例を見る:http://www.gnu.org/software/parallel/man.html

紹介ビデオをご覧ください:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

チュートリアルを進めてください:http://www.gnu.org/software/parallel/parallel_tutorial.html

サポートを受けるには、メール リストに登録してください。https://lists.gnu.org/mailman/listinfo/parallel

答え2

GNU make では、--jobs並列実行オプションを使用できますが、ジョブの数は指定された数に制限されます。マシンを破壊しない程度にジョブ数を調整できます。

以下は、ターゲット ah (これらは出力ファイルなど) を使用し、各ターゲットに対して (ダミーの) コマンド セットを実行する Makefile の例です。

all: a b c d e f g h

a b c d e f g h:
    echo $@; sleep 10

注: コマンドのインデントしなければならないタブ文字でなければなりません。GNU make ドキュメントMakefile の構文の詳細については、 を参照してください。

次のように make を呼び出すとmake --jobs 4、次の出力が得られます (time make --jobs 4経過時間を表示するために以下を使用しました)。

echo a; sleep 10
echo b; sleep 10
echo c; sleep 10
echo d; sleep 10
b
a
c
d
echo e; sleep 10
echo f; sleep 10
echo g; sleep 10
e
f
echo h; sleep 10
g
h

real    0m20.009s
user    0m0.010s
sys 0m0.011s

最初の 4 つは並行して実行され、その後に次の 4 つが実行されたため、経過時間の合計は 20 秒になります。

関連情報