web-dev-qa-db-ja.com

特定の数のプロセスを実行し続けるにはどうすればよいですか?

たくさんの.wavファイルを.mp3に変換するためのシェルスクリプトを書こうとしています。 「find」コマンドを使用してそれらを検索し、次に「lame」コマンドを使用して変換します。これには単純なforループを使用できますが、いくつかの並列プロセスを使用してこれを行う必要があります。

たとえば4のように、定義された数のプロセスが必要です。各プロセスでファイルの変換を開始します。 1つのファイルが1つのプロセスで変換を終了したら、次のファイルに置き換えます。これにアプローチする最良の方法は何ですか?

3
nicusor

リストをxargsに渡し、-nおよび/または-Pオプションを使用して、任意の時点で実行されているプロセスの数を制御することをお勧めします。

2
John

makeはこれに適しています。 Makefileのようなものが必要になります

%.mp3: %.wav
lame $(LAMEOPTS) $< $@

次に、ターゲットのリストを生成します。

$ find . -name '*.wav' -type f | sed -e 's/\(.*\.\)wav$/all: \1mp3/' >>Makefile

次に、makeにタスクをスケジュールするように指示します。

$ make -r -j4 -f Makefile
2
Toby Speight

まだ誰もGNU並列について言及していないことに驚いています。それを使用すると、コマンドは次のように単純になります。

find -type f -name '*.wav' -print0 | parallel -0 lame {} {.}.mp3

これにより、各入力ファイルの拡張子をmp3に置き換えるように求められます。デフォルトでは、並列はマシン上のCPUと同じ数のジョブを実行しますが、-j <i>integer</i>を使用して別の値を設定できます。スイッチ--dry-runは、実行されるコマンドを確認するのに役立ちます。

2
dhag

xjobsがインストールされている場合、これはまさにそれが設計された種類のタスクであることがわかります。特に、-jオプションの説明を確認して、作成されるプロセスの数を調整してください。

0
Toby Speight