Bash shell脚本中的并行处理&x27;pid不是此shell的子对象';

Bash shell脚本中的并行处理&x27;pid不是此shell的子对象';,bash,shell,parallel-processing,wait,Bash,Shell,Parallel Processing,Wait,我对shell脚本中的并行处理有一个问题。我有一个程序my 我希望在循环中的循环中运行多次的程序。这个计划基本上是这样的: 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/

我对shell脚本中的并行处理有一个问题。我有一个程序
my
我希望在循环中的循环中运行多次的程序
。这个计划基本上是这样的:

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
,但是在进入下一个外部循环迭代之前,等待所有这些都完成。根据对的回答,我尝试了以下方法:

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
都像以前一样立即启动

我做错了什么?我能做些什么来实现我的目标?谢谢。

()
调用子shell,然后子shell调用find/myprogram,因此您正在处理“孙子”进程。您不能等待孙子,只能等待直系子代(也称为子代)。

()
调用子shell,然后子shell调用find/myprogram,因此您正在处理“孙子”进程。你不能等待孙子孙女,只能等待直系后代(即子女)。

你可能会发现这很有用

这将与CPU内核并行运行一样多的
/myProgram

您可能会发现这很有用


这将作为CPU内核并行运行多达
/myProgram

()
调用子shell,然后子shell调用find/myProgram,因此您正在处理“孙子”进程。你不能等孙子孙女,只能等直系子孙(又名子女)。我明白了。我可以修改我的代码使他们成为孩子而不是孙子吗?对,我已经去掉了括号,它似乎起作用了。Megaparty,将您的评论作为答案发布,您就有钱了。
()
调用子shell,然后子shell调用find/myprogram,因此您正在处理“孙子”进程。你不能等孙子孙女,只能等直系子孙(又名子女)。我明白了。我可以修改我的代码使他们成为孩子而不是孙子吗?对,我已经去掉了括号,它似乎起作用了。Megaparty,发表你的评论作为回答,你就有钱了。
parallel -j+0 ./myProgram ::: $MYPATH/$SUBDIRS/*