У меня есть вопрос о параллельной обработке в сценариях оболочки.У меня есть программа my
Program
, которую я хочу запустить несколько раз в цикле внутри цикла.Эта программа в основном такова:
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 &)
Однако, это началось все около 300 или около того вызовов myProgram
одновременно, вызывая проблемы с ОЗУ и т. Д.
Что я хотел бы сделать, так это запускать каждое вхождение myProgram
во внутреннем цикле параллельно, но подождать, пока все они завершатся, прежде чем перейти к следующей итерации внешнего цикла.Основываясь на ответах на этот вопрос , я попробовал следующее:
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
Но я получил следующее предупреждение / ошибку, повторенное несколько раз:
./myScript.sh: line 30: wait: pid 1133 is not a child of this shell
... и все myPrograms
были запущены сразу, как и раньше.
Что я делаю не так?Что я могу сделать, чтобы достичь своих целей?Спасибо.