2012-01-24 3 views
4

This solutionに基づいて、実行中のプロセス数を4に制限するスクリプトを作成しようとしています。しかし、代わりに、ジョブをIインデックスによる参照。私は次のように書いています:スクリプトを使用して限られた数の並列プログラムを実行しています

todo_array[1]="echo start1;sleep 3;echo done1" 
todo_array[2]="echo start2;sleep 3;echo done2" 
todo_array[3]="echo start3;sleep 3;echo done3" 
todo_array[4]="echo start4;sleep 3;echo done4" 
todo_array[5]="echo start5;sleep 3;echo done5" 
todo_array[6]="echo start6;sleep 3;echo done6" 
todo_array[7]="echo start7;sleep 3;echo done7" 
todo_array[8]="echo start8;sleep 3;echo done8" 
todo_array[9]="echo start9;sleep 3;echo done9" 

max_jobs=4 

seq ${#todo_array[@]} | xargs -i --max-procs=$max_jobs bash -c $todo_array[{}] 

しかし、私は空の9改行出力を取得しています。 私は何が間違っていますか? おかげで

EDIT:私は

seq ${#todo_array[@]} | xargs -i --max-procs=$max_jobs bash -c "$todo_array[{}]" 

にそれを修正し、私は次のような奇妙な出力取得しています:あなたの質問は、教育ではなく、単に「どのように実行する場合

start1 
start1 
start1 
start1 
done1[2] 
done1[3] 
done1[1] 
done1[4] 
start1 
start1 
start1 
start1 
done1[5] 
done1[6] 
done1[7] 
done1[8] 
start1 
done1[9] 
+0

私はあなたのスクリプトを実行する場合、私は空の改行を得ることはありません。 bash:[3]:コマンドが見つかりませんでした。 bash:[2]:コマンドが見つかりませんでした。 bash:[4]:コマンドが見つかりません。 bash:[1]:コマンドが見つかりませんでした。 –

+0

私はあなたがおそらく "&"(並行してジョブを実行する)と "$$"(開始した各バックグラウンドジョブのPIDを追跡したい)と思っています。 – paulsm4

+0

配列参照には中括弧が必要です。 '$ {todo_array [1]}'。しかし、 'xargs -IX --max-procs = $ max_jobs bash -c" $ {todo_array [X]} "は私のためには機能しません。 –

答えて

4

は、この方法を試してください。

#!/bin/bash 

todo_array[1]="echo start1;sleep 3;echo done1" 
todo_array[2]="echo start2;sleep 3;echo done2" 
todo_array[3]="echo start3;sleep 3;echo done3" 
todo_array[4]="echo start4;sleep 3;echo done4" 
todo_array[5]="echo start5;sleep 3;echo done5" 
todo_array[6]="echo start6;sleep 3;echo done6" 
todo_array[7]="echo start7;sleep 3;echo done7" 
todo_array[8]="echo start8;sleep 3;echo done8" 
todo_array[9]="echo start9;sleep 3;echo done9" 

max_jobs=4 

for i in "${todo_array[@]}" 
do 
    echo $i 
done | xargs -IX --max-procs=$max_jobs bash -c "X" 
+3

xargsの '-I'オプションを使用したときの素晴らしい作業のために+1 – anubhava

3

を限られた数の並列プログラム "の場合、私の助言はスクリプトを使用せず、ホイールを再作成する代わりに、その目的のために正確に作られたGNU Parallelを使用します。

はちょうどそれが並列するパイプを、あなたのコマンドでスクリプトを作成し、すなわち

例で
./myScript.sh | parallel -j2 

、並列に2つのジョブを実行しますが、最後にスクリプトの出力を収集しますパラレルあなたが実際にスクリプトを次々に実行した場合と同じように、もちろん、タスクは独立していなければなりません。その意図についての質問は明確ではない。

0

あなたはppssをチェックアウトすることができます。スクリプト/シェルのために強力なスレッダを使用するのは簡単です。

関連する問題