2011-11-07 26 views
1

シェルスクリプトの並列処理に関する質問があります。私はループ内でループ内で複数回実行したいというプログラムmy Programを持っています。このプログラムは基本的に次のとおりです。シェルスクリプトの並列処理、 'pidはこのシェルの子ではありません'

MYPATHDIR=`ls $MYPATH` 
for SUBDIRS in $MYPATHDIR; do 
    SUBDIR_FILES=`ls $MYPATH/$SUBDIRS` 
    for SUBSUBDIRS in $SUBDIR_FILES; do 
    find $MYPATH/$SUBDIRS/$SUBSUBDIRS | ./myProgram $MYPATH/$SUBDIRS/outputfile.dat 
    done 
done 

私がしたいのは、並列処理を利用することです。だから私は、一度にすべてのmyProgramsを開始するために中央のラインのためにこれを試してみました:

(find $MYPATH/$SUBDIRS/$SUBSUBDIRS | ./myProgram $MYPATH/$SUBDIRS/outputfile.dat &) 

はしかし、これはRAMの問題を引き起こして、すべての300かそこらが同時にmyProgramに呼び出しを開始したなど

を私はしたいと思いますどのようなmyProgramの各オカレンスを内部ループ内で並列に実行しますが、これらのすべてが終了するのを待ってから、次のアウターループの繰り返しに移ります。

./myScript.sh: line 30: wait: pid 1133 is not a child of this shell 

...とmyProgramsが一度に開始されたすべて:

for SUBDIRS in $MYPATHDIR; do 
    SUBDIR_FILES=`ls $MYPATH/$SUBDIRS` 
    for SUBSUBDIRS in $SUBDIR_FILES; do 
    (find $MYPATH/$SUBDIRS/$SUBSUBDIRS | ./myProgram $MYPATH/$SUBDIRS/outputfile.dat &) 
    done 
    wait $(pgrep myProgram) 
done 

しかし、私は次の警告/エラーを得た、複数回繰り返す:this questionへの回答に基づいて、私は、次の試してみました、 従来通り。

私は間違っていますか?私の目的を達成するために私は何ができますか?ありがとう。

+0

'()'はサブシェルを呼び出し、find/myprogramを呼び出すので、 "孫"プロセスを処理しています。あなたは孫だけを待つことはできません。子孫は直系子孫です。 –

+0

私は参照してください。私のコードを変更して、孫の代わりに子供にすることはできますか? –

+0

右の括弧を取り除いたところ、それは機能しているようです。 Megaparty、答えとしてあなたのコメントを投稿し、あなたはお金に入っています。 –

答えて

3

()はfind/myprogramを呼び出すサブシェルを呼び出すので、 "孫"プロセスを処理しています。あなたは孫だけを待つことはできません。子孫は直系子孫です。

1

GNU Parallelが役に立ちます。

parallel -j+0 ./myProgram ::: $MYPATH/$SUBDIRS/* 

これは、CPUコアとして並行して./myProgramとして実行されます。

関連する問題