shell脚本中的并行处理,'pid不是这个shell的子代'

时间:2011-11-07 17:46:10

标签: bash shell parallel-processing wait

我对shell脚本中的并行处理有疑问。我有一个程序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 &)

然而,这开始同时调用myProgram所有300个左右,导致RAM问题等。

我想要做的是在内部循环中并行运行myProgram的每次出现,但等待所有这些完成后再继续进行下一个外循环迭代。根据{{​​3}}的答案,我尝试了以下内容:

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 个答案:

答案 0 :(得分:3)

()调用一个子shell,然后调用find / myprogram,这样你就可以处理“孙子”进程。你不能等到孙子孙女,只有直系后代(又名孩子)。

答案 1 :(得分:1)

您可能会发现GNU Parallel有用。

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

这将与./myProgram并行运行多达{{1}}。