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

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

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

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

しかし、一方で実行すると、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 はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。

GNU並列スケジューリング

インストールする

セキュリティ上の理由から、パッケージマネージャを使用してGNU Parallelをインストールする必要がありますが、GNU Parallelが展開用にパッケージ化されていない場合は、rootアクセスを必要としないプライベートインストールを実行できます。これは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

コマンドのインデントに注意してください〜しなければならないTAB文字です。より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秒です。

関連情報