シェルスクリプトの並列処理に関する質問があります。私はループ内でループ内で複数回実行したいというプログラム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への回答に基づいて、私は、次の試してみました、 従来通り。
私は間違っていますか?私の目的を達成するために私は何ができますか?ありがとう。
'()'はサブシェルを呼び出し、find/myprogramを呼び出すので、 "孫"プロセスを処理しています。あなたは孫だけを待つことはできません。子孫は直系子孫です。 –
私は参照してください。私のコードを変更して、孫の代わりに子供にすることはできますか? –
右の括弧を取り除いたところ、それは機能しているようです。 Megaparty、答えとしてあなたのコメントを投稿し、あなたはお金に入っています。 –