Параллельная обработка в сценариях оболочки: «pid не является потомком этой оболочки» - PullRequest
1 голос
/ 07 ноября 2011

У меня есть вопрос о параллельной обработке в сценариях оболочки.У меня есть программа 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 были запущены сразу, как и раньше.

Что я делаю не так?Что я могу сделать, чтобы достичь своих целей?Спасибо.

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

() вызывает подоболочку, которая затем вызывает find / myprogram, так что вы имеете дело с процессами "внуков". Вы не можете ждать внуков, только прямые потомки (или дети).

1 голос
/ 08 ноября 2011

Вы можете найти GNU Parallel полезным.

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

Параллельно будет работать столько же, сколько ./myProgram ядер процессора.

...